Python 3 - 正则表达式

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

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

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

匹配单个字符的基本模式

Sr.No.表达&匹配
1

a,X,9,<

普通字符完全匹配.

2

. (a period)

匹配除换行符之外的任何单个字符'\ n'

3

\w

匹配"单词"字符:字母或数字或下划线[a-zA-Z0-9 _].

4

\ W

匹配任何非单词字符.

5

\ b

单词和非单词之间的边界

6

\ s

匹配单个空白字符 - 空格,换行符,返回标签

7

\S

匹配任何非空白字符.

8

\ t,\ n,\ r

标签,换行符,返回

9

\d

十进制数字[0-9]

10

^

匹配字符串的开头

11

&dollar;

匹配字符串的结尾

12

\

inhibit角色的"特殊性".

编制标志

编译标志允许您修改正则表达式的工作方式. re模块中的标志有两个名称,一个是长名称,例如 IGNORECASE ,还有一个简短的单字母形式,例如I.

Sr.No.Flag&含义
1

ASCII,A

使几个转义符如\ w,\ b,\ n和\d仅匹配具有相应属性的ASCII字符.

2

DOTALL,S

制作,匹配任何字符,包括换行符

3

IGNORECASE,I

请做个案 - 不敏感的匹配

4

LOCALE,L

进行区别设置匹配

5

MULTILINE,M

多行匹配,影响^和&USD;

6

VERBOSE,X(用于'扩展')

启用详细的RE,可以更清晰,更易于理解

匹配函数

此函数尝试将RE 模式 string 匹配,并带有可选的标志.

以下是此函数的语法 :

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


以下是参数的说明 :

Sr.No.参数&说明
1

pattern

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

2

string

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

3

flags

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

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

Sr.No.匹配对象方法&说明
1

group(num = 0)

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

2

groups()

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

示例

#!/usr/bin/python3
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


搜索函数

此函数使用可选的标记字符串中搜索第一次出现的RE 模式 .

以下是此函数的语法 :

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


以下是参数的说明 :

Sr.No.参数&说明
1

pattern

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

2

string

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

3

flags

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

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

Sr.No.匹配对象方法&说明
1

group(num = 0)

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

2

groups()

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

示例

#!/usr/bin/python3
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!!")


当执行上面的代码时,它产生以下结果 :

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


匹配与搜索

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

示例

#!/usr/bin/python3
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


搜索和替换

最重要的一个重新使用正则表达式的方法是 sub .

语法

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


此方法替换<的所有出现的RE 模式 i> string  with repl ,替换所有出现,除非提供 max .此方法返回修改后的字符串.

示例

#!/usr/bin/python3
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 []内部或者用反斜杠转义时)并将未转义的#视为注释标记.

正则表达式

除控制字符外,(&plus;?.* ^&dollar;()[] {} | \),所有字符都与自己匹配.您可以通过在控制字符前加一个反斜杠来转义它.

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

Sr.No.参数&说明
1

^

匹配行首.

2

&dollar;

匹配行尾.

3

.

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

4

[...]

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

5

[^ ...]

匹配括号内的任何单个字符

6

re *

匹配0个或多个前面的表达式.

7

re&plus;

匹配前面一个或多个表达式.

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

匹配空格.相当于[\\\\\\\\].

26

\S

匹配非空白.

27

\d

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

28

\ D

匹配非数字.

29

\A

匹配字符串的开头.

30

\ Z

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

31

\ z

匹配字符串结尾.

32

\ G

匹配最后一场比赛结束的点.

33

\ b

在括号外匹配字边界.在括号内匹配退格(0x08).

34

\B

匹配非字边界.

35

\ n,\t等

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

36

\ 1 ... \ 9

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

37

\10

匹配已匹配的第n个分组子表达式.否则引用字符代码的八进制表示.

正则表达式示例

字面字符

Sr.No.示例&说明
1

python

匹配"python".

字符类

Sr.No.示例&说明
1

[Pp] ython

匹配"Python"或"python"

2

rub [ye]

匹配"ruby"或"rube"

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 _]


R. epetition Cases

Sr.No.示例&说明
1

ruby?

匹配"rub"或"ruby":y是可选的

2

ruby *

匹配"rub"加0或更多ys

3

ruby&plus;

匹配"rub"加1或更多ys

4

\d {3}

完全匹配3位数

5

\d {3,}

匹配3位或更多位数

6

\d{3,5}

匹配3,4或5位

Nongreedy重复

这匹配最小的重复次数 :

Sr.No.示例&说明
1

<.*>

贪婪重复:匹配"< python> perl>"

2

<.*?>

Nongreedy:匹配"< python>"在"< python> perl>"

使用括号分组

Sr.No.示例&说明
1

\D\d&plus;

没有群组:&plus;重复\d

2

(\D\d)&plus;

分组:&plus;重复 \D\d 

3

([Pp] ython(,)?)&plus;

匹配"Python","Python,python,python"等等.

反向引用

这与先前的匹配匹配组再次和减号;

Sr.No.示例&说明
1

([Pp])ython& \ nails

匹配python& pails或Python& Pails

2

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

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

替代品

Sr.No.示例&描述
1

python | perl

匹配"python"或"perl"

2

rub(y | le)

匹配"ruby"或"卢布"

3

Python(!&plus; | \?)

"Python"后跟on或者更多!或者一个?

锚点

这需要指定匹配位置.

Sr.No.示例&说明
1

^ Python

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

2

Python&dollar;

在字符串或行的末尾匹配"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的情况下进行分组反向引用