Python3正则表达式


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

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

我们将介绍两个重要的函数,这些函数将用于处理正则表达式。不过,首先要注意的是:存在各种字符,当在正则表达式中使用它们时,它们将具有特殊的含义。为了避免在处理正则表达式时造成任何混乱,我们将使用Raw Strings作为 '表达' .

匹配单个字符的基本模式

序号 表达与比赛
1

a,X,9,<

普通字符完全匹配自己。

2

。 (一段时间)

匹配除换行符'\ 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

$

匹配字符串的结尾

12

\

抑制角色的“特殊性”。

编译标志

编译标志使你可以修改正则表达式的工作方式的某些方面。 re模块中的标志在两个名称下可用,一个长名称如 遗忘症 以及简短的单字母形式(例如I)。

序号 标志与意义
1

ASCII, A

使多个\ w,\ b,\ s和\ d这样的转义符仅在具有各自属性的ASCII字符上匹配。

2

小号

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

3

IGNORECASE,我

进行不区分大小写的匹配

4

L本地

进行区域设置匹配

5

多行,M

多行匹配,影响^和$

6

VERBOSE,X(表示“扩展”)

启用详细的RE,这些RE可以更清晰,更易懂地组织

比赛功能


此功能尝试匹配RE pattern to string 带有可选 flags .

这是此函数的语法:

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

这是参数的描述:

序号 参数及说明
1

pattern

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

2

string

这是字符串,将对其进行搜索以匹配字符串开头的模式。

3

flags

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

The re.match 函数返回一个 match 反对成功 None 失败。我们用 组(数字) or groups() 的功能 match 对象以获取匹配的表达式。

序号 匹配对象的方法和说明
1

组(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的首次出现 pattern within string 带有可选 flags .

这是此函数的语法:

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

这是参数的描述:

序号 参数及说明
1

pattern

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

2

string

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

3

flags

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

The 研究 函数返回一个 match 反对成功 none 失败。我们用 组(数字) or groups() 的功能 match 对象以获取匹配的表达式。

序号 匹配对象的方法和说明
1

组(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根据正则表达式提供了两种不同的基本操作: match 仅在字符串开头检查匹配项,而 search 检查字符串中任何位置的匹配项(这是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

搜索和替换


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

语法

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

此方法替换所有出现的RE pattern in 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

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


正则表达式文字可以包括一个可选的修饰符,以控制匹配的各个方面。修饰符被指定为可选标志。你可以使用异或(|)提供多个修饰符,如前所示,并可能由以下之一表示:

序号 修饰符和说明
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中可用的正则表达式语法:

正则表达式示例


文字字符

序号 范例与说明
1

python

匹配“ python”。

角色类


序号 范例与说明
1

[pp] ython

匹配“ Python”或“ python”

2

rub[ye]

匹配“ ruby​​”或“ rube”

3

[aeiou]

匹配任何一个小写的元音

4

[0-9]

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

5

[a-z]

匹配任何小写ASCII字母

6

[A-Z]

匹配任何大写ASCII字母

7

[a-zA-Z0-9]

符合以上任何条件

8

[^aeiou]

匹配小写元音以外的其他任何东西

9

[^0-9]

匹配数字以外的任何东西

特殊字符类


序号 范例与说明
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_]

重复案例


序号 范例与说明
1

ruby?

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

2

ruby*

匹配“ rub”加上0或更多的ys

3

ruby+

匹配“ rub”加上1个或多个ys

4

\d{3}

精确匹配3位数字

5

\d{3,}

匹配3个或更多数字

6

\d{3,5}

匹配3、4或5位数字

非贪婪重复


这与最少的重复次数相符:

序号 范例与说明
1

<。*>

贪婪重复:匹配“ perl>”

2

<。*?>

非贪婪:匹配“ perl>”中的“

用括号分组


序号 范例与说明
1

\D\d+

无组:+重复\ d

2

(\D\d)+

分组:+重复\ D \ d对

3

([Pp] ython(,)?)+

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

反向引用


这将再次匹配先前匹配的组:

序号 范例与说明
1

([Pp])ython&\ 1ails

匹配python&pails或Python&Pails

2

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

单引号或双引号字符串。 \ 1匹配第一个组匹配的任何内容。 \ 2匹配第二组匹配的任何东西,依此类推。

备择方案


序号 范例与说明
1

python | perl

匹配“ python”或“ perl”

2

擦(y | le)

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

3

Python(!+ | \?)

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

Anchors


这需要指定匹配位置。

序号 范例与说明
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”,如果没有后跟一个感叹号。

带括号的特殊语法


序号 范例与说明
1

R(?#comment)

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

2

R(?i)uby

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

3

R(?i:uby)

同上

4

擦(?:y | le))

仅分组而不创建\ 1反向引用