^:匹配字符串的开头
$:匹配字符串的末尾。
A:匹配字符串的开头
:匹配字符串的末尾
.:匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[...]:用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'
[^...] : 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
re*: 匹配0个或多个的表达式。
re+:匹配1个或多个的表达式。 有几个匹配几个
re?: 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式 只匹配符合条件最少字符
re{ n}:精确匹配 n 个前面表达式。例如, o{2} 不能匹配 "Bob" 中的 "o",但是能匹配 "food" 中的两个 o。
re{ n,}:匹配 n 个前面表达式。例如, o{2,} 不能匹配"Bob"中的"o",但能匹配 "foooood"中的所有 o。
'|':匹配|左或|右的字符,re.search('abc|ABC','ABCBabcCD').group()) 返回结果ABC
(re):对正则表达式分组并记住匹配的文本
"o{1,}" 等价于 "o+"。"o{0,}" 则等价于 "o*"。
(?imx):正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。
[a-z]:匹配a-z之间任意字符 [0-9] [A-Z] 相同
[^a-z] :匹配除a-z之间的数
d :匹配任意数字等价[0-9]
D:匹配一个非数字 [^0-9]
w :匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
W:匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。
s:匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ f
v]。
S:匹配任何非空白字符。等价于 [^ f
v]。
匹配三种方法:
re.match(正则表达式,字符串) 从头开始匹配的
re.search():匹配到一个就返回,匹配不到返回空
re.findall:返回所有匹配结果,findall没有group()方法
re.split():分割
re.sub():替换
例子:
print(re.match('[0-9]{1,3}','aaalb345d67b')) # None
print(re.search('[0-9]{1,3}','aaalb345d67b')) # <_sre.SRE_Match object; span=(5, 8), match='345'>
print(re.findall('[0-9]{1,3}','aaalb345d67b')) # ['345', '67']
具体每种匹配规则的实例:
print(re.match('aaa?','aaalb345d67b')) # <_sre.SRE_Match object; span=(0, 3), match='aaa'>
print(re.match('^a','aaalb345d67b')) #<_sre.SRE_Match object; span=(0, 1), match='a'>
print(re.search('b$','aaalb345d67b')) #<_sre.SRE_Match object; span=(11, 12), match='b'>
print(re.match('a.','aaalb345d67b')) #<_sre.SRE_Match object; span=(0, 2), match='aa'>
print(re.match('a*','aaalb345d67b')) # <_sre.SRE_Match object; span=(0, 3), match='aaa'>
print(re.match('a+','aaalb345d67b')) #<_sre.SRE_Match object; span=(0, 3), match='aaa'>
print(re.match('a.+','aaalb345d67b')) # <_sre.SRE_Match object; span=(0, 12), match='aaalb345d67b'>
print(re.match('a.*','aaalb345d67b')) # <_sre.SRE_Match object; span=(0, 12), match='aaalb345d67b'>
print(re.findall('a{2}','aaalb345d67b')) # <_sre.SRE_Match object; span=(0, 2), match='aa'>
print(re.search('abc|ABC','ABCBabcCD')) # <_sre.SRE_Match object; span=(0, 3), match='ABC'>
print(re.search('abc|ABC','ABCBabcCD').group()) # ABC
# findall没有group()方法
print(re.findall('abc|ABC','ABCBabcCD')) # ['ABC', 'abc']
分组匹配:
group()
line = "Cats are smarter than dogs"
# r代表为非转义的原始字符串
matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
if matchObj:
#matchObj.group() 等同于 matchObj.group(0),表示匹配到的完整文本字符
print("matchObj.group() : ", matchObj.group()) # Cats are smarter than dogs
# (.*) 第一个匹配分组,.* 代表匹配除换行符之外的所有字符
print ("matchObj.group(1) : ", matchObj.group(1)) #Cats
# (.*?) 第二个匹配分组,.*? 后面多个问号,代表非贪婪模式,也就是说只匹配符合条件的最少字符 0个或1个
print ("matchObj.group(2) : ", matchObj.group(2)) #smarter
else:
print ("No match!!")
'(?P...)' 分组匹配
print(re.search('(?P<id>[0-9]+)','abcd1234daf034').group()) # 1234
s = '1102231990xxxxxxxx'
res = re.search('(?P<province>d{3})(?P<city>d{3})(?P<born_year>d{4})',s)
print(res.groupdict()) #{'province': '110', 'city': '223', 'born_year': '1990'}
分割和替换:
# 分割:re.split(正则表达式,字符串)
print(re.split('[0-9]+','abc12de3f45GH')) # ['abc', 'de', 'f', 'GH']
# 替换:re.sub(正则表达式,替换值,字符串)
print(re.sub('[0-9]+','s','abc12de3f45GH')) # abcsdesfsGH