Python - 正则表达式


正则表达式是一种特殊的字符序列,可帮助您使用模式中保存的专用语法来匹配或查找其他字符串或字符串集。正则表达式也称为 regex,是定义搜索模式的字符序列。俗称正则表达式或正则表达式;它是指定文本中匹配模式的字符序列。通常,字符串搜索算法使用此类模式对字符串进行“查找”或“查找和替换”操作,或者用于输入验证。

数据科学项目中的大规模文本处理需要对文本数据进行操作。包括Python在内的许多编程语言都支持正则表达式处理。Python 的标准库有一个用于此目的的“re”模块。

由于 re 模块中定义的大多数函数都使用原始字符串,因此让我们首先了解原始字符串是什么。

原始字符串

正则表达式使用反斜杠字符 ('\') 来指示特殊形式或允许使用特殊字符而不调用其特殊含义。另一方面,Python 使用相同的字符作为转义字符。因此Python 使用原始字符串表示法。

如果字符串在引号之前带有 r 或 R 前缀,则该字符串成为原始字符串。因此 'Hello' 是一个普通字符串,而 r'Hello' 是一个原始字符串。

>>> normal="Hello"
>>> print (normal)
Hello
>>> raw=r"Hello"
>>> print (raw)
Hello

正常情况下,两者没有区别。但是,当转义字符嵌入到字符串中时,普通字符串实际上会解释转义序列,而原始字符串不会处理转义字符。

>>> normal="Hello\nWorld"
>>> print (normal)
Hello
World
>>> raw=r"Hello\nWorld"
>>> print (raw)
Hello\nWorld

在上面的示例中,当打印普通字符串时,会处理转义字符“\n”以引入换行符。然而,由于原始字符串运算符“r”,转义字符的效果不会按照其含义进行翻译。

元字符

大多数字母和字符都会简单地匹配它们自己。但是,某些字符是特殊元字符,与自身不匹配。元字符是具有特殊含义的字符,类似于通配符中的*。

这是元字符的完整列表 -

. ^ $ * + ? { } [ ] \ | ( )

方括号符号[和]表示您希望匹配的一组字符。字符可以单独列出,也可以作为用“-”分隔的字符范围列出。

先生。 元字符和描述
1

[ABC]

匹配任意字符 a、b 或 c
2

[交流]

它使用范围来表示同一组字符。
3

[阿兹]

仅匹配小写字母。
4

[0-9]

仅匹配数字。
5

'^'

补足[]中的字符集。[^5]将匹配除“5”之外的任何字符。

'\' 是转义元字符。当后面跟着各种字符时,它会形成各种特殊序列。如果需要匹配 [ 或 \,可以在它们前面加上反斜杠以删除其特殊含义:\[ 或 \\。

下面列出了由此类以 '\' 开头的特殊序列表示的预定义字符集 -

先生。 元字符和描述
1

\d

匹配任何十进制数字;这相当于类 [0-9]。
2

\D

匹配任何非数字字符;这相当于类 [^0-9]。
3 \s匹配任何空白字符;这相当于类 [\t\n\r\f\v]。
4

\S

匹配任何非空白字符;这相当于类 [^\t\n\r\f\v]。
5

\w

匹配任何字母数字字符;这相当于类 [a-zAZ0-9_]。
6

\W

匹配任何非字母数字字符。相当于类 [^a-zAZ0-9_]。
7

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

匹配左侧出现 0 或 1 次模式
9

+

左侧出现 1 次或多次该模式
10

*

左侧出现 0 次或多次该模式
11

\b

单词和非单词之间的边界,/B 与 /b 相反
12

[..]

匹配方括号中的任何单个字符,[^..] 匹配方括号之外的任何单个字符。
13

\

它用于特殊含义的字符,例如\。匹配句点或 \+ 表示加号。
14

{n,m}

匹配前面至少出现 n 次且最多出现 m 次
15

一个| 乙

匹配 a 或 b

Python 的 re 模块提供了有用的函数,用于查找匹配、搜索模式以及用其他字符串替换匹配的字符串等。

re.match() 函数

此函数尝试将字符串开头的RE模式与可选标志进行匹配。

这是该函数的语法-

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

这是参数的描述 -

先生。 参数及说明
1

图案

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

2

细绳

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

3

旗帜

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

re.match函数在成功时返回一个匹配对象,在失败时返回None。匹配对象实例包含有关匹配的信息:开始和结束的位置、匹配的子字符串等。

匹配对象的start()方法返回模式在字符串中的起始位置,end()返回端点。

如果未找到模式,则匹配对象为 None。

我们使用匹配对象的group(num)groups()函数来获取匹配的表达式。

先生。 匹配对象方法和描述
1 group(num=0)此方法返回整个匹配项(或特定子组编号)
2 groups()此方法返回元组中所有匹配的子组(如果没有则为空)

例子

import re
line = "Cats are smarter than dogs"
matchObj = re.match( r'Cats', line)
print (matchObj.start(), matchObj.end())
print ("matchObj.group() : ", matchObj.group())

它将产生以下输出-

0 4
matchObj.group() : Cats

re.search() 函数

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

这是该函数的语法-

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

这是参数的描述 -

先生。 参数及说明
1

图案

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

2

细绳

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

3

旗帜

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

re.search函数在成功时返回一个匹配对象,在失败时返回任何内容。我们使用匹配对象的group(num)groups()函数来获取匹配的表达式。

先生。 匹配对象方法和描述
1 group(num=0)此方法返回整个匹配项(或特定子组编号)
2 groups()此方法返回元组中所有匹配的子组(如果没有则为空)

例子

import re
line = "Cats are smarter than dogs"
matchObj = re.search( r'than', line)
print (matchObj.start(), matchObj.end())
print ("matchObj.group() : ", matchObj.group())

它将产生以下输出-

17 21
matchObj.group() : than

匹配与搜索

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

例子

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.findall() 函数

findall() 函数以字符串或元组列表的形式返回字符串中模式的所有非重叠匹配项。从左到右扫描字符串,并按找到的顺序返回匹配项。结果中包含空匹配项。

句法

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

参数

先生。 参数及说明
1

图案

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

2

细绳

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

3

旗帜

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

例子

import re
string="Simple is better than complex."
obj=re.findall(r"ple", string)
print (obj)

它将产生以下输出-

['ple', 'ple']

以下代码借助 findall() 函数获取句子中的单词列表。

import re
string="Simple is better than complex."
obj=re.findall(r"\w*", string)
print (obj)

它将产生以下输出-

['Simple', '', 'is', '', 'better', '', 'than', '', 'complex', '', '']

re.sub() 函数

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

句法

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

此方法将字符串中所有出现的 RE模式替换为repl,除非提供了max ,否则替换所有出现的情况。此方法返回修改后的字符串。

例子

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

例子

以下示例使用 sub() 函数将所有出现的 is 替换为 was 单词 -

import re
string="Simple is better than complex. Complex is better than complicated."
obj=re.sub(r'is', r'was',string)
print (obj)

它将产生以下输出-

Simple was better than complex. Complex was better than complicated.

re.compile() 函数

compile() 函数将正则表达式模式编译为正则表达式对象,可以使用其 match()、search() 等方法进行匹配。

句法

re.compile(pattern, flags=0)

旗帜

先生。 修改器和描述
1

重新I

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

2

重新L

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

3

关于。

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

4

回复S

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

5

重新U

根据 Unicode 字符集解释字母。该标志影响 \w、\W、\b、\B 的Behave。

6

重新X

允许“更可爱”的正则表达式语法。它忽略空格(除了在集合 [] 内或通过反斜杠转义时)并将未转义的 # 视为注释标记。

序列 -

prog = re.compile(pattern)
result = prog.match(string)

相当于 -

result = re.match(pattern, string)

但是,当表达式在单个程序中多次使用时,使用 re.compile() 并保存生成的正则表达式对象以供重用会更有效。

例子

import re
string="Simple is better than complex. Complex is better than complicated."
pattern=re.compile(r'is')
obj=pattern.match(string)
obj=pattern.search(string)
print (obj.start(), obj.end())

obj=pattern.findall(string)
print (obj)

obj=pattern.sub(r'was', string)
print (obj)

它将产生以下输出 -

7 9
['is', 'is']
Simple was better than complex. Complex was better than complicated.

re.finditer() 函数

此函数返回一个迭代器,生成字符串中 RE 模式的所有非重叠匹配的匹配对象。

句法

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

例子

import re
string="Simple is better than complex. Complex is better than
complicated."
pattern=re.compile(r'is')
iterator = pattern.finditer(string)
print (iterator )

for match in iterator:
   print(match.span())

它将产生以下输出-

(7, 9)
(39, 41)

Python 正则表达式的用例

查找所有副词

findall() 匹配模式的所有出现,而不是像 search() 那样只匹配第一个模式。例如,如果作者想要查找某些文本中的所有副词,他们可能会按以下方式使用 findall() -

import re
text = "He was carefully disguised but captured quickly by police."
obj = re.findall(r"\w+ly\b", text)
print (obj)

它将产生以下输出-

['carefully', 'quickly']

查找以元音开头的单词

import re
text = 'Errors should never pass silently. Unless explicitly silenced.'
obj=re.findall(r'\b[aeiouAEIOU]\w+', text)
print (obj)

它将产生以下输出-

['Errors', 'Unless', 'explicitly']