0%

【Python笔记】正则表达式

1、定义

​ 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。

2、正则表达式字符

1、普通字符

字符 描述
[ABC] 匹配 [...] 中的所有字符,例如[aeiou]匹配字符串 中所有的aeiou字符。
[^ABC] 匹配除了[...]中字符的所有字符,例如 [^aeiou]匹配字符串中除了aeiou外所有字符。
[A-Z] [A-Z]表示一个区间,匹配所有大写字母,[a-z]表示所有小写字母。
. 匹配除换行符(\n\r)之外的任何单个字符,等价于 [^\n\r]
\w 匹配字母、数字、下划线,等价于 [A-Za-z0-9_]

2、非打印字符

字符 描述
\cx 匹配由x指明的控制字符。例如, \cM匹配一个Control-M或回车符。x 的值必须为 A-Z 或 a-z 之一,否则将 c 视为一个原义的 c 字符。
\f 匹配一个换页符,等价于\x0c\cL
\n 匹配一个换行符,等价于\x0a\cJ
\r 匹配一个回车符,等价于\x0d\cM
\s 匹配任何空白字符,包括空格、制表符、换页符等等,等价于 [ \f\n\r\t\v]。注意 Unicode正则表达式会匹配全角空格符。
\S 匹配任何非空白字符,等价于[^ \f\n\r\t\v]
\t 匹配一个制表符,等价于\x09\cI
\v 匹配一个垂直制表符,等价于\x0b\cK

3、特殊字符

字符 描述
$$` 匹配输入字符串的结尾位置,要匹配$$字符本身,请使用$`。
( ) 标记一个子表达式的开始和结束位置,子表达式可以获取供以后使用,要匹配这些字符,请使用 \(\)
* 匹配前面的子表达式零次或多次,要匹配 * 字符,请使用 \*
+ 匹配前面的子表达式一次或多次,要匹配 + 字符,请使用 \+
. 匹配除换行符 \n 之外的任何单字符,要匹配 . ,请使用 \.
[ 标记一个中括号表达式的开始,要匹配 [,请使用 \[
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符,要匹配 ? 字符,请使用 \?
\ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, n 匹配字符 n\n 匹配换行符。序列 \\ 匹配 \,而 \( 则匹配 (
^ 匹配输入字符串的开始位置,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。要匹配 ^ 字符本身,请使用 \^
{ 标记限定符表达式的开始。要匹配 {,请使用 \{
` ` 指明两项之间的一个选择。要匹配 ` ,请使用\ `。

4、限定符

字符 描述
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 z 以及 zoo* 等价于{0,}
+ 匹配前面的子表达式一次或多次。例如,zo+ 能匹配 zo 以及 zoo,但不能匹配 z,+ 等价于 {1,}
? 匹配前面的子表达式零次或一次。例如,do(es)? 可以匹配 dodoes 中的 doesdoxy 中的 do? 等价于 {0,1}
{n} n 是一个非负整数。匹配确定的 n 次。例如,o{2} 不能匹配 Bob 中的 o,但是能匹配 food 中的 oo
{n,} n 是一个非负整数。至少匹配n 次。例如,o{2,} 不能匹配 Bob 中的 o,但能匹配 foooood 中的所有 oooooo{1,} 等价于 o+o{0,} 则等价于 o*
{n,m} mn 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,o{1,3} 将匹配 foooood 中的匹配项为ooooo请注意在逗号和两个数之间不能有空格

5、定位符

字符 描述
^ 匹配输入字符串开始的位置。
$ 匹配输入字符串结尾的位置。
\b 匹配一个单词边界,即字与空格间的位置。
\B 非单词边界匹配。

3、Python中使用正则匹配

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
""" 正则匹配 """
import re
from tool import topic


@topic("Demo-1")
def demo_1():
string = "www.baidu.com"
print(re.match("www", string).span()) # 在起始位置匹配
print(re.match("com", string)) # 不在起始位置匹配
pass


@topic("Demo-2")
def demo_2():
string = "www.baidu.com"
print(re.search("www", string))
print(re.search("www", string).span())
print(re.search("com", string))
print(re.search("com", string).span())

pattern = re.compile("[abcd]+")
print(re.search(pattern, string))
print(re.search(pattern, string).span())
pass


@topic("Demo-3")
def demo_3():
string = "www.baidu.com"
pattern = re.compile("[A-D]+", flags=re.I)
print(re.findall(pattern, string))

print(pattern.match(string))
print(pattern.search(string))
print(pattern.findall(string))
pass


if __name__ == "__main__":
demo_1()
demo_2()
demo_3()
pass
修饰符 描述
re.I 使匹配对大小写不敏感
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^$
re.S 使 . 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

相关链接

正则表达式 - 语法

正则表达式在线测试工具