Python 正则表达式初使用

基本操作

ab 字符串ab
x|y x或y
\y 特殊字符y 比如 ^+{}$()[]|-?*

子母类

[a-d] a、b、c、d中的某个字符
[^a-d] 与上面相
[^(123|abc)] 匹配除了a、b、c 或者1、2、3这几个字符以外的任意字符
\d 一个数字字符
\D 一个非数字字符
\s 一个空白字符
\S 一个非空白字符
\w 一个字母数字字符
\W 一个非字母数字字符

数量相关

x* 0个或多个x
x+ 1个或多个x
x? 0个或1个x
x{2} 2个且仅2个x
x{2,5} 2-5个x

转义字符

\n 换行符
\r 回车符
\t tab

定界符

^ 字符串的

向后引用

(\d{1,3}).){3}\d{1,3} 可以该写为 ((\d{1,3}).){3}\2

要指定一个子表达式的组名,使用这样的语法:(\d+)或者(‘Digit’\d+)),这样就把“\d+”的组名指定为Digit了。要反向引用这个分组捕获的内容,你可以使用\k,所以上面的IP匹配表达式写成((\d{1,3}).){3}\k

常用分组

捕获

(exp) 匹配exp,并捕获文本到自动命名的组里
(?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号

零宽断言

(?=exp) 匹配exp,前面的位置
(?<=exp) 匹配exp,后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置

懒惰限定

*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复

Python的特殊匹配规则

\A 仅匹配字符串开头 \Aabc 结果 abc
\Z 仅匹配字符串末尾 abc\Z 结果 abc
(?P<name>) 分组,除了原有编号外指定一个额外的名字 (?P<word>abc){2} 结果 abcabc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# -*- coding:UTF-8 -*-
import re
def main():
# 显示有Lenore或者Nevermore行。
fh = open('raven.txt')
for line in fh:
if re.search('(Len|Neverm)ore', line):
print(line, end='')
fh.close()
# 把所有匹配到的文本显示出来。
fh = open('raven.txt')
for line in fh:
match = re.search('(Len|Neverm)ore', line)
if match:
print(match.group())
fh.close()
# 将行中所有Lenore或Nevermore 替换为###。
# 替换1
fh = open('raven.txt')
for line in fh:
print(re.sub('(Len|Neverm)ore', '###', line), end='')
fh.close()
# 替换2
fh = open('raven.txt')
for line in fh:
match = re.search('(Len|Neverm)ore', line)
if match:
print(line.replace(match.group(), '###'), end='')
fh.close()
# 预编译正则
fh = open('raven.txt')
pattern = re.compile('(Len|Neverm)ore', re.IGNORECASE) # 预编译
for line in fh:
if re.search(pattern, line):
print(line, end='') # 如果要替换可写成 print(pattern.sub('###', line), end='')
fh.close()
if __name__ == "__main__":
main()
打赏支持:支付宝/微信。如果你觉得我的文章对你有所帮助,可以打赏我哟。