Python中的正则表达式语法
2018-08-13 本文已影响0人
octocat
-
.
匹配除了换行符之外的所有字符
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
可以匹配foo
、foo.
、(foo)
、bar foo baz
,但不能匹配foobar
或foo3