10 正则表达式
文章目录
- 1 匹配规则
- 1. 普通字符
- 2. 元字符
- 3. 量词 - 控制字符出现的次数
- 4. 位置锚点 - 匹配位置,而不是字符
- 5. 分组与捕获
- 6. 选择符
- 2 Python应用
- 2.1 re模块
- 2.2 字符串分割
- 2.3 分组
- 2.4 预编译
1 匹配规则
1. 普通字符
大多数字符(字母、数字、汉字)就是普通字符,它们匹配自己。
abc
匹配字符串中的"abc"
你好
匹配字符串中的"你好"
2. 元字符
.
(点号):匹配任意一个字符(除了换行符\n
)。a.c
匹配"abc"
,"a@c"
,"a c"
\d
:匹配任意一个数字。等价于[0-9]
。\d\d
匹配"12"
,"05"
\w
:匹配任意一个字母、数字或下划线。等价于[A-Za-z0-9_]
。\w\w
匹配"Ab"
,"a1"
,"_x"
\s
:匹配任意一个空白字符(包括空格、制表符\t
、换行符\n
等)。\D
,\W
,\S
:分别是\d
,\w
,\s
的反面。\D
匹配非数字的任意字符。
[...]
(字符组):匹配方括号内的任意一个字符。[aeiou]
匹配任意一个元音字母。[a-z]
匹配任意一个小写字母(-
表示范围)。[0-9a-fA-F]
匹配一个十六进制数字。
[^...]
(否定字符组):匹配不在方括号内的任意一个字符。[^0-9]
匹配任意一个非数字字符。
3. 量词 - 控制字符出现的次数
*
:匹配零次或多次。ab*c
匹配"ac"
(0次b),"abc"
(1次b),"abbc"
(多次b)
+
:匹配一次或多次。ab+c
匹配"abc"
,"abbc"
,但不匹配"ac"
?
:匹配零次或一次(即可选的)。colou?r
匹配"color"
和"colour"
(u出现0次或1次)
{n}
:匹配确定的 n 次。\d{4}
匹配恰好4个数字,如"2024"
{n,}
:匹配至少 n 次。\d{2,}
匹配至少2个数字,如"12"
,"123"
{n,m}
:匹配至少 n 次,最多 m 次。\d{2,4}
匹配2到4个数字,如"12"
,"123"
,"2024"
4. 位置锚点 - 匹配位置,而不是字符
^
:匹配字符串的开始位置。^Hello
匹配以"Hello"
开头的字符串。
$
:匹配字符串的结束位置。world!$
匹配以"world!"
结尾的字符串。
\b
:匹配一个单词的边界(即单词开头或结尾的空隙)。\bcat\b
匹配单词"cat"
,但不匹配"category"
或"scatter"
中的"cat"
。
5. 分组与捕获
(...)
:- 分组:将多个字符组合成一个整体,以便对其使用量词。
(abc)+
匹配"abc"
,"abcabc"
。
- 捕获:提取匹配到的内容,供后续使用或替换。
- 在替换操作中,可以用
$1
,$2
来引用被括号捕获的内容。
- 在替换操作中,可以用
- 分组:将多个字符组合成一个整体,以便对其使用量词。
(?:...)
:非捕获分组。只分组,不捕获,提高效率。
6. 选择符
|
:表示“或”关系。cat|dog
匹配"cat"
或"dog"
。gr(a|e)y
匹配"gray"
或"grey"
。
# []表示范围,只匹配一个字符
[abc] 只能是 a b c 其中之一
[a-zA-Z] a到z 或 A到Z# ^ 表示 非
[^abc] 除 a b c 之外的任何字符# && 表示 且
[a-z&&[^e-g]] a 到 z 且 除了 e 到 g(等同于[a-dh-z])# | 表示 或
[a-z|A-Z] 小写字母或大写字母# 预定义字符
. 任何字符
\d 数字
\s 空白字符
\w 英文字母、数字、下划线\D 非数字
\S 非空白字符
\W 非英文字母、数字、下划线# 数量词
x? 0个或1个x
x* 0个或多个x
x+ 1个或多个x
x{n} 正好n个x
x{n,} 至少n个x
x{n, m} n到m个x# \ 转义字符
[0-9]\-[0-9] 数字-数字# ^ 必须是开头 $ 必须是结尾
^hello 可以匹配 hello world 不能匹配 say hello
world$ 可以匹配 hello world 不能匹配 world peace
2 Python应用
2.1 re模块
re
模块中包含正则表达式的所有功能,因为Python本来也有转义字符\
,所以\\
才能表示\
,为了方便,我们可以直接使用r''
去除转义功能。
使用re.match()
方法判断是否匹配,如果匹配成功,返回一个Match
对象,否则返回None
。常见的判断方法就是:
import re
if re.match(r'正则表达式', str):print('ok')
else:print('failed')
2.2 字符串分割
使用正则表达式分割字符串比常规的split()
方法更加强大。
# 普通split()
'1 2 3 4'.split(' ') # ['1', '', '', '2', '3', '', '4']# 正则split()
re.split(r'正则表达式', str)re.split(r'\s+', '1 2 3 4') # ['1', '2', '3', '4']re.split(r'[\s,;]+', '1 , 2,;, 3 ,4') # ['1', '2', '3', '4']
2.3 分组
()
表示要提取的分组,如果正则表达式中定义了组,就可以在Match
对象上用group()
方法提取出子串来。
group()
和group(0)
表示匹配的完整字符串,group(1)
和group(2)
依次代表第1、第2个子串,以此类推。
import re qq = 'qq:12345678'
reg = r'^(qq):([1-9]\d{4,9})$'
m = re.match(reg, qq)
print(m)
print(m.group()) # qq:12345678
print(m.group(0)) # qq:12345678
print(m.group(1)) # qq
print(m.group(2)) # 12345678
2.4 预编译
如果一个正则表达式要用很多次,可以使用预编译。
import re# 预编译
re_qq = re.compile(r'^(qq):([1-9]\d{4,9})$')# 使用
print(re_qq.match('qq:41532531').group(2))