1、特殊符号(先解释,后面会有例子)
表示 | 描述 |
---|---|
re1|re2 | 或的关系 |
. | 匹配任何字符(\n除外),要显示的匹配.号,需要加\| |
^ | 匹配字符串的开头 |
$ | 匹配字符串的结尾 |
* | 匹配0次或多次前面出现的正则表达式 |
+ | 匹配1次或者多次前面出现的正则表达式 |
? | 匹配0次或者一次(一句话,就是匹配越少越好) |
{N} | 重复N次前面出现的正则表达式 |
{M,N} | 匹配M~N次前面出现的正则 |
【abcd】 | 匹配集合中某一个元素 |
【x-y】 | 匹配x~y范围内任意的一个字符(如【A-Za-z】匹配大小写 |
【^……】 | 不匹配集合里的字符(切记:^【……】意义是匹配以集合元素开头的) |
注意 | 直接使用\…的时候是在用r‘\……’情况使用的,不用r是要用\……才能使用 |
\d | 匹配十进制数字 |
\w | 匹配任何字母数字 |
\s | 匹配任何空字符(\S与之相反) |
\N | 匹配已经保存的子组 |
\A | 和^一个意思 |
\Z | 和$一个意思 |
(?=.com) | 如何一个字符串跟着.com才做匹配操作 |
(?!.net) | 如何一个字符串后面不是跟着.net才做匹配操作 |
(?(1)y|x) | 如果一个匹配组(1)存在,就和y匹配,否则和x匹配 |
2、re模块函数
函数方法 | 描述 |
---|---|
compile(str,flags) | 预编译一个正则模式,返回正则表达式对象 |
match(pattern,str,flags) | 从头开始按照pattern模式匹配str |
search(pattern,str,flags) | 随意按照pattern模式查找str |
findall(pattern,string,flags) | 查找字符串中所有非重复出现的正则表达式模式,并返回一个列表 |
finditer(pattern,string,flags) | 与findall()一样,只是返回一个迭代器 |
sub(patter,repl,string,count) | 使用repl替换所有正则在string中出现的位置,如果没有count就会替换所有 |
(?iLmsux)部分详细解释 | 下列属性 |
re.I、re.IGNORECASE | 不区分大小写的匹配 |
re.M、re.MULTLINE | 根据^和$的开始和结束来匹配 |
3、使用match()方法匹配字符串
>>>import re
>>>m = re.match('foo','food on the table')
>>>m.group()#group()返回匹配对象
'foo'
4、使用search()方法查找
>>>import re
>>>m = re.rearch('foo',seafood')
>>>m.group()
'foo'
5、匹配多个字符串
>>>bt ='bat|bet|bit'
>>>m = re.match(bt,'bat')
>>>m.group()
'bat'
6、匹配单个字符
>>>anyend = '.end'
>>>m = re.match(anyend,'bend')
>>>m.group()
'bend'
7、创建字符集【】
>>>m = re.match('[cr][23][dp][o2]','c3po')
>>>m.group()
'c3po'
8、group()和groups()区别
#一个括号代表一个组
#groups返回一个元祖
>>>m = re.match('(\w\w\w)-(\d\d\d)','abc-123')
>>>m.group()
'abc-123'
>>>m.group(1)
'abc'
>>>m.group(2)
'123'
>>>m.groups()
('abc','123')
9、findall查找所有的,finditer迭代
>>>re.findall(r'(th\w+)','This and that,re.I)
#re.I忽略大小写,r是使用原生字符
['This','that']
>>>it = re.finsiter(r'th\w+)','This and that',re.I)
>>> g = it.__next__()
>>>g.groups()
('This',)
>>g.group(1)
'This'
>>>g = it.__next__()
>>>g.groups()
('that',)
10、使用sub()和subn()搜索和替换
>>>re.sub('X','Mr.Smith','attn:X',\n')
'attn:Mr.Smith,\n'
#subn会返回('attn:Mr.Smith,\n',1),替换了一次
#\N是分组编号
>>>re.sub(r'(\d{1,2})/(\d{1,2})/(\d{2}|\d{4}',
... r'\2/\1/\3','2/20/91')
'20/2/91'
#替换的结果就是结果的第一个组变成第二个组,第二个组变成第一个
11、贪婪与不贪婪
#贪婪
>>>pat = '.+\d+-\d+-\d+'
>>>date = 'Thu Feb 15 17:46:04 2007::uziff@jiojf.g::1212345-6-8'
>>>re.search(pat,date).group()
'Thu Feb 15 17:46:04 2007::uziff@jiojf.g::1212345-6-8'
#不贪婪
>>>pat = '.+?\d+-\d+-\d+'
...
...
>>>re.search(pat,date).group()
'1212345-6-8'