当前位置: 首页 > 文档资料 > Python 中文教程 >

Reg Expressions

优质
小牛编辑
128浏览
2023-12-01

regular expression是一种特殊的字符序列,可帮助您使用模式中保存的专用语法来匹配或查找其他字符串或字符串集。 正则表达式在UNIX世界中被广泛使用。

该模块在Python中为类似Perl的正则表达式提供了完全支持。 如果在编译或使用正则表达式时发生错误,则re模块会引发异常re.error。

我们将介绍两个重要的函数,它们将用于处理正则表达式。 但首先要做的是:有各种各样的字符,当它们用于正则表达式时会有特殊意义。 为了避免在处理正则表达式时出现任何混淆,我们将使用Raw Strings作为r'expression'

match功能

此函数尝试将RE pattern与带有可选flags string匹配。

这是此函数的语法 -

re.match(pattern, string, flags=0)

以下是参数的说明 -

Sr.No.参数和描述
1

pattern

这是要匹配的正则表达式。

2

string

这是字符串,将搜索该字符串以匹配字符串开头的模式。

3

flags

您可以使用按位OR(|)指定不同的标志。 这些是修饰符,列在下表中。

re.match函数在成功时返回match对象,在失败时返回None 。 我们使用match对象的group(num)groups()函数来获得匹配的表达式。

Sr.No.匹配对象方法和描述
1

group(num=0)

此方法返回整个匹配(或特定子组num)

2

groups()

此方法返回元组中所有匹配的子组(如果没有则为空)

例子 (Example)

#!/usr/bin/python
import re
line = "Cats are smarter than dogs"
matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
if matchObj:
   print "matchObj.group() : ", matchObj.group()
   print "matchObj.group(1) : ", matchObj.group(1)
   print "matchObj.group(2) : ", matchObj.group(2)
else:
   print "No match!!"

执行上面的代码时,会产生以下结果 -

matchObj.group() :  Cats are smarter than dogs
matchObj.group(1) :  Cats
matchObj.group(2) :  smarter

search功能

此函数使用可选flagsstring搜索第一次出现的RE pattern

这是此函数的语法 -

re.search(pattern, string, flags=0)

以下是参数的说明 -

Sr.No.参数和描述
1

pattern

这是要匹配的正则表达式。

2

string

这是字符串,将搜索该字符串以匹配字符串中任何位置的模式。

3

flags

您可以使用按位OR(|)指定不同的标志。 这些是修饰符,列在下表中。

re.search函数在成功时返回match对象,在失败时返回none 。 我们使用match对象的group(num)groups()函数来获得匹配的表达式。

Sr.No.匹配对象方法和描述
1

group(num=0)

此方法返回整个匹配(或特定子组num)

2

groups()

此方法返回元组中所有匹配的子组(如果没有则为空)

例子 (Example)

#!/usr/bin/python
import re
line = "Cats are smarter than dogs";
searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)
if searchObj:
   print "searchObj.group() : ", searchObj.group()
   print "searchObj.group(1) : ", searchObj.group(1)
   print "searchObj.group(2) : ", searchObj.group(2)
else:
   print "Nothing found!!"

执行上面的代码时,会产生以下结果 -

searchObj.group() :  Cats are smarter than dogs
searchObj.group(1) :  Cats
searchObj.group(2) :  smarter

匹配与搜索

Python提供了两种基于正则表达式的不同原语操作: match仅在字符串的开头检查匹配,而search在字符串中的任何位置检查匹配(这是Perl默认执行的操作)。

例子 (Example)

#!/usr/bin/python
import re
line = "Cats are smarter than dogs";
matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:
   print "match --> matchObj.group() : ", matchObj.group()
else:
   print "No match!!"
searchObj = re.search( r'dogs', line, re.M|re.I)
if searchObj:
   print "search --> searchObj.group() : ", searchObj.group()
else:
   print "Nothing found!!"

执行上述代码时,会产生以下结果 -

No match!!
search --> matchObj.group() :  dogs

搜索和替换

使用正则表达式的最重要的re方法之一是sub

语法 (Syntax)

re.sub(pattern, repl, string, max=0)

此方法用repl替换string所有出现的RE pattern ,替换所有出现,除非提供max 。 此方法返回修改的字符串。

例子 (Example)

#!/usr/bin/python
import re
phone = "2004-959-559 # This is Phone Number"
# Delete Python-style comments
num = re.sub(r'#.*$', "", phone)
print "Phone Num : ", num
# Remove anything other than digits
num = re.sub(r'\D', "", phone)    
print "Phone Num : ", num

执行上述代码时,会产生以下结果 -

Phone Num :  2004-959-559
Phone Num :  2004959559

正则表达式修饰符:选项标志

正则表达式文字可以包括可选修饰符来控制匹配的各个方面。 修饰符被指定为可选标志。 您可以使用异或(|)提供多个修饰符,如前所示,可以用其中一个来表示 -

Sr.No.修饰符和描述
1

re.I

执行不区分大小写的匹配。

2

re.L

根据当前区域设置解释单词。 此解释会影响字母组(\ w和\ W)以及字边界行为(\ b和\ B)。

3

re.M

使$匹配行的结尾(不仅仅是字符串的结尾)并使^匹配任何行的开头(不仅仅是字符串的开头)。

4

re.S

使句点(点)匹配任何字符,包括换行符。

5

re.U

根据Unicode字符集解释字母。 此标志会影响\ w,\ W,\ b,\ B的行为。

6

re.X

允许“cuter”正则表达式语法。 它忽略了空格(除了set []内部或者用反斜杠转义时),并将未转义的#视为注释标记。

正则表达式

除了控制字符, (+ ? . * ^ $ ( ) [ ] { } | \) ,所有字符都匹配。 您可以通过在控制字符前加一个反斜杠来转义它。

下表列出了Python中可用的正则表达式语法 -

Sr.No.模式和描述
1

^

匹配行首。

2

$

匹配行尾。

3

.

匹配除换行符之外的任何单个字符。 使用m选项也可以匹配换行符。

4

[...]

匹配括号中的任何单个字符。

5

[^...]

匹配不在括号中的任何单个字符

6

re*

匹配前面表达式的0次或更多次出现。

7

re+

匹配1个或多个前面的表达式。

8

re?

匹配前面表达式的0或1次出现。

9

re{ n}

准确匹配前面表达式的n个出现次数。

10

re{ n,}

匹配前面表达式的n次或多次出现。

11

re{ n, m}

匹配前面表达式的至少n次和最多m次出现。

12

a| b

匹配a或b。

13

(re)

对正则表达式进行分组并记住匹配的文本。

14

(?imx)

暂时切换正则表达式中的i,m或x选项。 如果在括号中,只有该区域受到影响。

15

(?-imx)

暂时切换正则表达式中的i,m或x选项。 如果在括号中,只有该区域受到影响。

16

(?: re)

将正则表达式分组而不记住匹配的文本。

17

(?imx: re)

暂时切换括号内的i,m或x选项。

18

(?-imx: re)

暂时切换括号内的i,m或x选项。

19

(?#...)

评论。

20

(?= re)

使用模式指定位置。 没有范围。

21

(?! re)

使用模式否定指定位置。 没有范围。

22

(?》 re)

匹配独立模式,无需回溯。

23

\w

匹配单词字符。

24

\W

匹配非单词字符。

25

\s

匹配空白。 相当于[\ t\n\r\n]。

26

\S

匹配非空白。

27

\d

匹配数字。 相当于[0-9]。

28

\D

匹配非数字。

29

\A

匹配字符串的开头。

30

\Z

匹配字符串的结尾。 如果存在换行符,则它在换行符之前匹配。

31

\z

匹配字符串的结尾。

32

\G

匹配指向上一场比赛结束的位置。

33

\b

在括号外匹配单词边界。 在括号内匹配退格(0x08)。

34

\B

匹配非字边界。

35

\n, \t, etc.

匹配换行符,回车符,制表符等。

36

\1...\9

匹配第n个分组子表达式。

37

\10

如果已匹配,则匹配第n个分组子表达式。 否则指的是字符代码的八进制表示。

正则表达式示例

文字字符

Sr.No.示例和说明
1

python

匹配“python”。

角色类

Sr.No.示例和说明
1

[Pp]ython

匹配“Python”或“python”

2

rub[ye]

匹配“红宝石”或“鲁布”

3

[aeiou]

匹配任何一个小写元音

4

[0-9]

匹配任何数字; 与[0123456789]相同

5

[az]

匹配任何小写ASCII字母

6

[AZ]

匹配任何大写的ASCII字母

7

[a-zA-Z0-9]

匹配上述任何一项

8

[^aeiou]

匹配小写元音以外的任何内容

9

[^0-9]

匹配除数字之外的任何内容

特殊字符类

Sr.No.示例和说明
1

.

匹配除换行符之外的任何字符

2

\d

匹配数字:[0-9]

3

\D

匹配非数字:[^ 0-9]

4

\s

匹配空白字符:[\ t\r\n\f]

5

\S

匹配非空白:[^\t\r\n\f]

6

\w

匹配单个字符:[A-Za-z0-9_]

7

\W

匹配非单词字符:[^ A-Za-z0-9_]

重复案件

Sr.No.示例和说明
1

ruby?

匹配“rub”或“ruby”:y是可选的

2

ruby*

匹配“擦”加0或更多ys

3

ruby+

匹配“擦”加1或更多ys

4

\d{3}

正好匹配3位数

5

\d{3,}

匹配3位或更多位数

6

\d{3,5}

匹配3,4或5位数

Nongreedy重复

这匹配最小的重复次数 -

Sr.No.示例和说明
1

《.*》

贪心重复:匹配“ perl>”

2

《.*?》

Nongreedy:匹配“ perl>”中的“”

用括号分组

Sr.No.示例和说明
1

\D\d+

没有组:+重复\ d

2

(\D\d)+

分组:+重复\ D\d对

3

([Pp]ython(, )?)+

匹配“Python”,“Python,python,python”等。

反向引用(Backreferences)

这与之前匹配的组再次匹配 -

Sr.No.示例和说明
1

([Pp])ython&\1ails

匹配python和pails或Python&Pails

2

(['"])[^\1]*\1

单引号或双引号。 \1匹配第一组匹配的任何内容。 \2匹配第二组匹配的任何内容等。

替代品(Alternatives)

Sr.No.示例和说明
1

python|perl

匹配“python”或“perl”

2

rub(y|le))

匹配“红宝石”或“卢布”

3

Python(!+|\?)

“Python”后跟一个或多个! 还是一个?

Anchors

这需要指定匹配位置。

Sr.No.示例和说明
1

^Python

在字符串或内部行的开头匹配“Python”

2

Python$

在字符串或行的末尾匹配“Python”

3

\APython

在字符串的开头匹配“Python”

4

Python\Z

在字符串末尾匹配“Python”

5

\bPython\b

在单词边界匹配“Python”

6

\brub\B

\B是非单词边界:在“rube”和“ruby”中匹配“rub”但不单独

7

Python(?=!)

匹配“Python”,如果后跟感叹号。

8

Python(?!!)

匹配“Python”,如果没有后跟感叹号。

带括号的特殊语法

Sr.No.示例和说明
1

R(?#comment)

匹配“R”。 其余的都是评论

2

R(?i)uby

匹配“uby”时不区分大小写

3

R(?i:uby)

与上面相同

4

rub(?:y|le))

仅在不创建\ 1反向引用的情况下进行分组