你能用简单的方式解释 Python 正则表达式语法吗?


在本篇博客中,您将学习正则表达式 (RegEx),并使用 Python 的 re 模块(借助示例)与 RegEx 进行交互。

正则表达式 (RegEx) 是一系列字符,用于定义搜索模式。例如,

^a...s$

上面的代码定义了一个 RegEx 模式。任何以 a 开头,以 s 结尾的五字母字符串都符合该模式。

Python 有一个名为 re 的模块用于处理 RegEx。以下是一个示例 -

import re
pattern = '^a...s$'
test_string = 'abyss'
result = re.match(pattern, test_string)

if result:
   print("Search successful.")
else:
   print("Search unsuccessful.")

用于这些操作的不同类型的语法

re.findall()

re.findall() 方法返回一个包含所有匹配项的字符串列表。

示例

从字符串中提取数字的程序

import re 
string = 'hello 12 hi 89. Howdy 34'
pattern = '\d+'
print("Entered String=",string)
result = re.findall(pattern, string)
print("The numbers in the above string",result)

输出

Entered String= hello 12 hi 89. Howdy 34
The numbers in the above string ['12', '89', '34']

如果未找到模式,re.findall() 将返回一个空列表。

re.search()

re.search() 方法接受两个参数:一个模式和一个字符串。该方法查找 RegEx 模式与字符串匹配的第一个位置。

如果搜索成功,re.search() 将返回一个匹配对象;否则,它将返回 None。

字符串

match = re.search(pattern, str)

示例

import re
string = "Python is fun"
#check if 'Python' is at the beginning
match = re.search('\APython', string)
if match:
   print("pattern found inside the string")
else:
   print("pattern not found")

输出

pattern found inside the string

这里,match 包含一个匹配对象。

re.subn()

re.subn() 与 re.sub() 类似,除了它返回一个包含新字符串和替换次数的 2 个项目的元组。

示例

#Program to remove all whitespaces
import re
#multiline string
string = 'abc 12\
de 23 \n f45 6'
print("Orginal String =",string)
#matches all whitespace characters
pattern = '\s+'
#empty string
replace = ''
new_string = re.subn(pattern, replace, string)
print("New String=",new_string)

输出

Orginal String = abc 12de 23 
 f45 6
New String= ('abc12de23f456', 4)

re.split()

re.split 在存在匹配项的地方拆分字符串后,提供一个已拆分字符串的列表。

示例

import re
string = 'Twelve:12 Eighty nine:89.'
pattern = '\d+'
result = re.split(pattern, string)
print(result)

输出

['Twelve:', ' Eighty nine:', '.']

如果未找到模式,re.split() 将返回一个包含原始字符串的列表。

您可以将 maxsplit 参数传递给 re.split() 方法。它是将发生的拆分最大次数。

示例

import re

string = 'Twelve:12 Eighty nine:89 Nine:9.'
pattern = '\d+'

//maxsplit = 1
//split only at the first occurrence
result = re.split(pattern, string, 1)
print(result)

输出

['Twelve:', ' Eighty nine:89 Nine:9.']

顺便说一句,maxsplit 的默认值为 0;表示所有可能的拆分。

re.sub()

re.sub() 的语法为 -

re.sub(pattern, replace, string)

该方法返回一个字符串,其中匹配的出现次数被 replace 变量的内容替换。

示例

#Program to remove all whitespaces
import re
#multiline string
string = 'abc 12\ de 23 \n f45 6'
#matches all whitespace characters
pattern = '\s+'
#empty string
replace = ''
new_string = re.sub(pattern, replace, string)
print(new_string)

输出

abc12\de23f456

如果未找到模式,re.sub() 将返回原始字符串。

您可以将 count 作为第四个参数传递给 re.sub() 方法。如果省略,则结果为 0。这将替换所有出现。

示例

import re
#multiline string
string = "abc 12\
de 23 \n f45 6"
#matches all whitespace characters
pattern = '\s+'
replace = ''
new_string = re.sub(r'\s+', replace, string, 1)
print(new_string)

输出

abc12de 23 
 f45 6

匹配对象

您可以使用 dir() 函数获取匹配对象的函数和属性。

匹配对象的一些常用方法和属性如下 -

match.group()

group() 方法返回字符串中匹配的部分。

示例

import re
string = '39801 356, 2102 1111'
#Three digit number followed by space followed by two digit number
pattern = '(\d{3}) (\d{2})'
#match variable contains a Match object.
match = re.search(pattern, string)
if match:
   print(match.group())
else:
   print("pattern not found")

输出

801 35

这里,match 变量包含一个匹配对象。

我们的模式 (\d{3}) (\d{2}) 有两个子组 (\d{3}) 和 (\d{2})。您可以获取这些带括号的子组的字符串部分。方法如下 -

>>> match.group(1)
'801'

>>> match.group(2)
'35'

>>> match.group(1, 2)
('801', '35')

>>> match.groups()
('801', '35')

match.start(), match.end() and match.span()

The start() function returns the index of the start of the matched substring. Similarly, end() returns the end index of the matched substring.

>>> match.start()
2

>>> match.end()
8

The span() function returns a tuple containing start and end index of the matched part.

>>> match.span()
(2, 8)

match.re and match.string

The re attribute of a matched object returns a regular expression object. Similarly, string attribute returns the passed string.

>>> match.re
re.compile('(\d{3}) (\d{2})')

>>> match.string
'39801 356, 2102 1111'

我们已经涵盖了 re 模块中所有常用的方法。如果您想了解更多信息,请访问 Python 3 re 模块。

在 RegEx 之前使用 r 前缀

当在正则表达式之前使用 r 或 R 前缀时,表示原始字符串。例如,'\n' 是一个换行符,而 r'\n' 表示两个字符:一个反斜杠 \ 后跟 n。

反斜杠 \ 用于转义各种字符,包括所有元字符。但是,使用 r 前缀会使 \ 作为普通字符对待。

示例

import re
string = '\n and \r are escape sequences.'
result = re.findall(r'[\n\r]', string)
print(result)

输出

['\n', '\r']

结论

因此,这些是我们试图使用一些引人入胜的示例来解释的最基本和最重要的正则表达式概念。其中一些是编造的,但大多数是我们清理数据时遇到的实际问题,因此,将来如果您遇到问题,请再次查看示例;您可能会在那里找到解决方案。

更新于: 2023年4月4日

60 次浏览

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告