- 单个字符
符号 说明 普通字符 一对一的完整匹配 [] 范围内的任意一个字符,-表示ascii连续的字符,^表示取反的意思 \d 任意的数字字符,等价于[0-9] \D 任意的非数字字符,等价于[^0-9] \w 任意的字(数字、字母|汉字、下划线) \W 非字 \s 空白字符(空格、\n、\t、\r) \S 非空白字符 \b 单词边界(开头、结尾、空格、标点) \B 非词边界 . 匹配除\n以外的任意字符 - 次数限定
格式 说明 {m} 指定m次 {m,n} m~n次 {m,} 至少m次 {,n} 至多n次 ? 至多一次 + 至少一次 * 任意次,相当于{,} - 边界判断
^
:以指定的内容开头$
:以指定的内容结尾- 示例:
import re # ^:以指定字符开头 # s = re.search(r'^hello', 'hello world') # $:以指定字符结尾 s = re.search(r'hello$', 'world hello') if s: print(s.group())
|
的使用import re # |:或的意思,拥有最低的优先级 # 如果想要指定优先级可以使用() c = re.compile(r'hell(o|w)orld') # s = c.search('helloorld') s = c.search('hellworld') if s: print(s.group())
- 贪婪匹配
- 贪婪:在满足条件的情况下,最大限度的匹配。正则的匹配默认是贪婪的。
- 非贪婪:只要满足条件,能少匹配就少匹配。
- 示例:
import re # ?可以取消.+至少一次的贪婪匹配 # c = re.compile(r'a.+?b') # ?可以取消.*任意多次的贪婪匹配 c = re.compile(r'a.*?b') s = c.search('sdkabbbbbsdj') if s: print(s.group())
- 匹配模式
import re # re.I 忽略大小写的匹配 # s = re.search(r'hello', 'Hello', re.I) # re.M 多行匹配,默认是单行匹配 # s = re.search(r'^hello', 'world\nhello', re.M) string = '''<div> xxx </div>''' # re.S 单行匹配,使.可以匹配包含\n在内的任意字符 s = re.search(r'<div>.*</div>', string, re.S) if s: print(s.group())
- 分组匹配
- 示例1:
import re ''' c = re.compile(r'(\d+)([a-z]+)(\d+)') s = c.search('ahake123hello456sjhfakls') if s: # 完整的匹配结果 print(s.group(), s.span()) # 功能同上 print(s.group(0), s.span(0)) # 第一个()的内容 print(s.group(1), s.span(1)) print(s.group(2), s.span(2)) # 匹配的所有组信息 print(s.groups()) ''' # 匹配的结果将会按照()进行分割 c = re.compile(r'((\d+)([a-z]+)(\d+))') f = c.findall('ahake123hello456sjhfakls') print(f)
- 示例2:
import re # c = re.compile(r'<div><a>\w+</a></div>') # 无名分组:\1表示前面第一组的内容,就是第一个()匹配的内容 c = re.compile(r'<([a-z]+)><([a-z]+)>\w+</\2></\1>') # 命名分组: c = re.compile(r'<(?P<goudan>[a-z]+)><(?P<dahua>[a-z]+)>\w+</(?P=dahua)></(?P=goudan)>') s = c.search('<div><a>千锋教育</a></div>') # s = c.search('<b><a>千锋教育</b></a>') if s: print(s.group()) # 所有的分组匹配信息,是个元组 print(s.groups()) # 所有的分组匹配信息,是个字典,用于命名分组 print(s.groupdict())
标签: 正则表达式
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~