匹配模式
match
从头开始匹配,匹配到用group()
返回
s = '1234qych7890'
res1 = re.match('[0-9]', s).group() # 1 匹配到第一个数字
res2 = re.match('[a-z]', s) # None 第一个不是字母,没匹配到
search
全局匹配,匹配到就返回,用group()
取到返回值
s = '1234qych7890'
res1 = re.search('[0-9]', s).group() # 1
res2 = re.search('[a-z]', s).group() # q
findall
全局匹配,匹配到的所有的用列表返回
s = '1234qych7890'
res1 = re.findall('[0-9]', s) # ['1', '2', '3', '4', '7', '8', '9', '0']
res2 = re.findall('[a-z]', s) # ['q', 'y', 'c', 'h']
split
匹配到的字符当做列表分隔符,比方说几个字母按数字分开,跟findall相反,参数maxsplit
s = '12q34qh789f0'
res1 = re.split('[a-z]+', s) # ['12', '34', '789', '0']
res1 = re.split('[a-z]+', s,maxsplit=2) # ['12', '34', '789f0']
sub
匹配字符并替换,sub(pattern,repl,string,count=0,flags=0)
res1 = re.sub('[a-z]','#', '12q34qh789f0')
# 12#34##789#0
fullmatch
全部匹配成功才返回
res1 = re.fullmatch('1234qych7890', '1234qych7890').group()
# 1234qych7890
compile
制定匹配规则
s = '1234qych7890'
pattern = re.compile('\d+')
res1 = pattern.findall(s) # ['1234', '7890']
标识符flag
- I
忽略大小写 - M
多行模式,改变^$,按照一行一行来看了,换行符从符号变成了实际的行 - S
改变.
,包括了换行符,即所有字符 - X
可以添加注释
字符
.
匹配任意除换行符'\n'外的字符
res1 = re.findall('.', '1234qych\n7890')
# ['1', '2', '3', '4', 'q', 'y', 'c', 'h', '7', '8', '9', '0']
\
转义字符[...]
范围内的字符,^
表示取反
s = '1234qych7890'
res1 = re.findall('[a-z]', s) # ['q', 'y', 'c', 'h']
res1 = re.findall('[^a-z]', s) # ['1', '2', '3', '4', '7', '8', '9', '0']
预定义字符
\d
数字,相当于[0-9]
res = re.findall('\d', '1234qych7890')
# ['1', '2', '3', '4', '7', '8', '9', '0']
\D
非数字,[^\d]
res = re.findall('\D', '1234qych7890')
# ['q', 'y', 'c', 'h']
\s
空白字符串,\t\r\n\f\v
res = re.findall('\s', '1234qych\n7890')
# ['\n']
\S
非空白字符串,[^\s]
res = re.findall('\S', '1234qych\n7890')
# ['1', '2', '3', '4', 'q', 'y', 'c', 'h', '7', '8', '9', '0']
\w
字母数字下划线,[A-Za-z0-9]
res = re.findall('\w', '1234qych\n7890')
# ['1', '2', '3', '4', 'q', 'y', 'c', 'h', '7', '8', '9', '0']
\W
非字母数字下划线,[^\w]
res = re.findall('\W', '1234qych\n7890')
# ['\n']
数量
*
匹配前一个字符0或者无限次
res = re.search('ab*', 'abbbcd').group() # abbb
res = re.search('ab*', 'aabbbcd').group() # a
+
匹配前一个字符1或者无限次
res1 = re.search('ab+', 'abbbcd').group() # abbb
res2 = re.search('ab+', 'aabbbcd').group() # abbb
?
匹配前一个字符0或者1次
res1 = re.search('ab?', 'abbbcd').group() # ab
res2 = re.search('ab?', 'aabbbcd').group() # a
{m}
匹配前一个字符m次
res1 = re.search('ab{2}', 'abbbcd').group() # abb
{m,n}
匹配前一个字符m到n次
res2 = re.search('ab{1,3}', 'aabbbcd').group() # abbb
*?,+?,??,{m,n}?
变成非贪婪匹配
res2 = re.search('ab{1,3}?', 'aabbbcd').group() # ab
边界匹配
^
,\A
res1 = re.search('^aab\d+', 'aab112').group()
# aab112
$
,\Z
res1 = re.search('[a-z]+112$', 'aab112').group()
# aab112
\b
没搞懂\B
逻辑分组
|
或,多组从左到右依次匹配,单个字符
先尝试匹配左边的,成功则跳过右边,失败则匹配右边
res1 = re.search('(a|b|A)lex', 'Alex').group()
# Alex
res1 = re.search('(a|b|A)lex', 'alex1234Alex').group()
# alex
(...)
分组
res1 = re.search('(ab){2}\d+', 'abab123df').group()
# abab123
res1 = re.search('(ab).*(df)', 'abab123cdf').groups()
# ('ab', 'df')
(?P<name>...)
分组,加上别名
res1 = re.search('(?P<privince>\d{4})(?P<city>\d{4})', '12345678').groupdict()
# {'privince': '1234', 'city': '5678'}
参考资料