Python中的正则表达式语法

  • .匹配除了换行符之外的所有字符
import re
re.compile(r'.').match('\n') # return None
  • ^$表示匹配开头和结尾
  • *表示匹配0个或者多个 +表示匹配一个或者多个 ?表示匹配0个或者一个
  • 贪婪模式
    *, ?+都会尽可能的匹配多个字符,但是 *?,??+?都会尽可能少的匹配字符,比如
import re
re.compile(r'<p>(.*)</p>').match('<p>a</p><p>b</p>').groups()[0] # return 'a</a><a>b'
re.compile(r'<p>(.*?)</p>').match('<p>a</p><p>b</p>').groups()[0] # return 'a'
re.compile(r'a[b]?').match('ab').group() # return ab
re.compile(r'a[b]??').match('ab').group() # return a
  • {}
    {m}表示应该前面的正则精确的匹配m
    {m,n} 表示前面的正则应该出现m~n
    {,n} 表示0~n
    {m,}表示m次之上
    {m,n}?表示非贪婪的匹配
import re
re.compile('\w{3,5}').match('abcdefg').group() # return abcde
re.compile('\w{3,5}?').match('abcdefg').group() # return abc
  • \表示转义字符

  • []表示一个字符集合

    • 字符可以被单独罗列,例如:[amk] 会匹配 'a', 'm', 或 'k'.
    • 可以表示范围,如[a-zA-Z_0-9]表示匹配字母数字下划线。
    • 在集合内,特殊字符失去特殊意义。[.]只是表示匹配.
    • 可以使用如\w or \S等字符类别
    • ^[]中表示非,如[^\d]表示匹配所有非数字的字符
  • ...|...表示或,左右两边的表达式有一个成立那么就会匹配到

  • (...) 表示标识一段和正则匹配的字符。其后可以使用 \number 对应的数字来使用,如:

# 表示匹配单引号中的内容
re.compile(r'(\')(.*?)\1').match('\'hello\'').groups()[1] # return hello 
# \1 表示 第一个括号里面的单引号
  • (?iLmsux) 表示特别的匹配规则
    (?i)表示大小写不敏感
re.compile(r'(?i)a').match('A').group() # return A

这个的作用和将flag 参数加入到compile中是一个作用

  • (?:...)
    表示括号里面的正则不会被捕获到,即不会出现在 groups中,但是也不能用 \number来引用了
  • (?P<name>...)
    Django中的url就是使用这样的方式,这样的方式的有什么作用呢?可以使用变量名称来指代匹配字符,如:
import re
re.compile(r'(?P<name>\w+)').match('lucy').group('name') # lucy
# 匹配引号里面的内容
re.compile(r'(?P<quote>[\'"])(.*?)(?P=quote)').match('"haha"').group()
# (?P=quote) 就是对 (?P<quote>...) 的引用
  • (?#...)
    正则里面的打注释
  • (?=...)
    是目标字符串结束位置做的限制,如:
import re
re.compile(r'famil(?=y|ies)').match('family').group() # famil
re.compile(r'famil(?=y|ies)').match('families').group() # famil
  • (?!...)(?=...)类似,但是意思是非
  • (?<=...)
    是对目标字符串开始位置做的限制,如:
import re
re.compile(r'(?<=17)[\d]{9}').search('17600000000').group() # 600000000
# (?<=...)括号里面的正则只能匹配固定宽度的正则,如 [a]{3} 这种,不能匹配非固定长度的正则,如 {3,5}这种
# 否则会报 error: look-behind requires fixed-width pattern 的异常
# 这个地方只能使用search,而不能使用match。因为match是开头匹配,而search是查找
  • (?<!...)(?<=...) 类似,但是意思是非
  • \b 表示匹配单词结束
    \bfoo\b可以匹配 foofoo.(foo)bar foo baz,但不能匹配foobarfoo3
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • python的re模块--细说正则表达式 可能是东半球最详细最全面的re教程,翻译自官方文档,因为官方文档写的是真...
    立而人阅读 23,157评论 4 46
  • Python中的正则表达式(re) import rere.match #从开始位置开始匹配,如果开头没有则无re...
    BigJeffWang阅读 12,015评论 0 99
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,440评论 19 139
  • re模块手册 本模块提供了和Perl里的正则表达式类似的功能,不关是正则表达式本身还是被搜索的字符串,都可以...
    喜欢吃栗子阅读 9,475评论 0 13
  • 透析记8.26 今日透析。 早上醒来就感到房间内格外的凉快,窗外的风吹进来,风里满含着秋天浓浓的凉意,天气真是奇怪...
    小棕榈阅读 1,501评论 0 0