Python正则表达式(二):预设字符

来源:互联网 发布:c 软件下载 编辑:程序博客网 时间:2024/05/19 09:09

1、常用预设字符:



\d

匹配任何十进制数

等同于[0-9]



\D

匹配任何非数字字符

等同于 [^0-9]



\s

匹配任何空白字符

等同于 [ \t\n\r\f\v]



\S

匹配任何非空白字符

等同于 [^ \t\n\r\f\v]



\w

匹配任何字母数字字符

等同于[a-zA-Z0-9_]



\W

匹配任何非字母数字字符

等同于 [^a-zA-Z0-9_]


2、其他预设字符



\A
只匹配字符串首

当不在 MULTILINE 模式,\A 和 ^ 实际上是一样的。然而,在 MULTILINE 模式里,\A 只是匹配字符串首,而 ^ 则匹配每行行首。

>>> ref = re.compile("^a[a-z]*")>>> print ref.findall("""abc... ddd... aaa... 111""")['abc']>>> ref = re.compile("^a[a-z]*",re.M)>>> print ref.findall("""abc... ddd... aaa... 111""")['abc', 'aaa']>>> ref = re.compile("\Aa[a-z]*")>>> print ref.findall("""abc... ddd... aaa... 111""")['abc']


\Z
只匹配字符串尾



\f

匹配一个换页符

等价于 \x0c 和 \cL



\n

匹配一个换行符

等同于 \x0a 和 \cJ



\r

匹配一个回车符

等同于 \x0d 和 \cM



\t

匹配一个制表符

等同于 \x09 和 \cI



\v

匹配一个垂直制表符

等同于 \x0b 和 \cK



3、其他预设字符之零宽界定符(零宽界定符,是一个比较重要的概念,在后文中会详细阐述)



\b
单词边界

单词被定义为一个字母数字序列,因此词尾就是用空白符或非字母数字符来标示的。

>>> ref = re.compile(r"\bchinese\b")>>> print ref.search("i am a chinese")<_sre.SRE_Match object at 0x016129F8>>>> print ref.search("i am a chinese boy")<_sre.SRE_Match object at 0x016129F8>



\B

非单词边界



(?=...)
前向肯定界定符

... 表示 正则表达式。如果... 匹配成功,则返回成功。但是它并没有占位。

只有当...返回成功时,才会进行后续匹配。

>>> ref = re.compile("^(?=a)a{3}$")>>> print ref.match("aaa")<_sre.SRE_Match object at 0x013529F8>>>> ref = re.compile("^aa{3}$")>>> print ref.match("aaa")None

说明:零宽界定符并没有占位,它只是负责匹配。

就像一支10人的队伍,如果用非零宽界定符,来匹配第1个的性别,如果匹配成功,则匹配引擎会移至第2个;使用零宽界定符,则匹配引擎仍在第1个。


(?!...)
前向否定界定符

... 表示 正则表达式。如果... 匹配失败,则返回成功。

只有当...返回成功时,才会进行后续匹配。


示例:将以 "bat" 或 "exe" 结尾的文件名排除在外

ref = re.compile(".*[.](?!bat$|exe$).*$")



4、其他预设字符之捕获组、命名组



\num

捕获组

\num表示复制 group(num) 的结果,其中num表示组号

与\g<num>等同

>>> ref = re.compile(r"(a{3})(bb)\2")>>> print ref.match(r"aaabbbb").group()aaabbbb>>> print ref.match(r"aaabbbb").group(1)aaa>>> print ref.match(r"aaabbbb").group(2)bb


(?P<name>...)

命名组

命名组与捕获组作用和原理都相同,不同的是:捕获组用数字指定位置,而命名组用名字指定位置

>>> ref = re.compile(r"a{3}(?P<name>bb)(?P=name)")>>> print ref.match(r"aaabbbb").group()aaabbbb

建议:尽可能用命名组来取代捕获组。



小结:通过元字符以及预设字符的学习,你已经初步的掌握了正则表达式的书写。然而书写正则表达式,也仅仅是第一步。

下一篇中,我们将学习正则表达式的编译与匹配。

另外,由于正则表达式的复杂与高度抽象,因此我们很难一次就写出满足需求的正则表达式,试错、修改是必须的。




0 0
原创粉丝点击