1. 首页
  2. 技术文章

44、Python正则表达式

在本教程中,您将学习正则表达式(RegEx),并使用Python的re模块与RegEx一起使用(在示例的帮助下)

重新gularPRESSION(正则表达式)是字符序列,它定义一个搜索模式。例如,

^a...s$

上面的代码定义了RegEx模式。模式为:以以下任何五个字母开头的字符串一种 并以 s

使用RegEx定义的模式可用于与字符串匹配。

表达 细绳 配对?
^a...s$ abs 没有匹配
alias 比赛
abyss 比赛
Alias 没有匹配
An abacus 没有匹配

Python有一个名为reRegEx的模块。这是一个例子:

import re

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

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

在这里,我们使用re.match()函数来搜索图案 在 test_string。如果搜索成功,该方法将返回一个匹配对象。如果不是,则返回None


在 关于与RegEx一起使用的模块。在探讨这一点之前,让我们学习正则表达式本身。

如果您已经了解RegEx的基础知识,请跳至Python RegEx


使用正则表达式指定模式

为了指定正则表达式,使用了元字符。在上面的示例中,^$是元字符。


元字符

元字符是RegEx引擎以特殊方式解释的字符。以下是元字符列表:

[]   {} () |


[] – 方括号

方括号指定您要匹配的一组字符。

表达 细绳 配对?
[abc] a 1场比赛
ac 2场比赛
Hey Jude 没有匹配
abc de ca 5场比赛

[abc]如果您要匹配的字符串包含ab或中的任何一个,则此处将匹配c

您也可以使用-方括号内的字符指定范围。

  • [a-e]与相同[abcde]
  • [1-4]与相同[1234]
  • [0-39]与相同[01239]

您可以通过^在方括号的开头使用插入符号来补充(反转)字符集。

  • [^abc] 表示除以下以外的任何字符 一种 或者 b 或者 C
  • [^0-9] 表示任何非数字字符。

.期间

句点与任何单个字符匹配(换行符除外'\n')。

表达 细绳 配对?
.. a 没有匹配
ac 1场比赛
acd 1场比赛
acde 2个匹配项(包含4个字符)

^插入符号

插入符号^用于检查字符串是否某个特定字符开头

表达 细绳 配对?
^a a 1场比赛
abc 1场比赛
bac 没有匹配
^ab abc 1场比赛
acb 没有匹配项(以开头,a但之后没有b

$美元

美元符号$用于检查字符串是否某个特定字符结尾

表达 细绳 配对?
a$ a 1场比赛
formula 1场比赛
cab 没有匹配

*

星形符号*零个或多个剩余的模式匹配。

表达 细绳 配对?
ma*n mn 1场比赛
man 1场比赛
maaan 1场比赛
main 没有匹配项(a后面没有n
woman 1场比赛

+

加号会+匹配一个或多个出现在其上的模式。

表达 细绳 配对?
ma+n mn 没有匹配项(没有a字符)
man 1场比赛
maaan 1场比赛
main 没有匹配项(a后面不跟n)
woman 1场比赛

?问号

问号符号?零个或一次出现的模式匹配。

表达 细绳 配对?
ma?n mn 1场比赛
man 1场比赛
maaan 没有匹配项(超过一个a字符)
main 没有匹配项(a后面不跟n)
woman 1场比赛

{}大括号

考虑以下代码:{n,m}。这意味着至少ñ,最多  留给它的图案的重复。

表达 细绳 配对?
a{2,3} abc dat 没有匹配
abc daat 1场比赛(在)daat
aabc daaat 2个匹配项(位于aabc和)daaat
aabc daaaat 2个匹配项(位于aabc和)daaaat

让我们再尝试一个示例。此RegEx[0-9]{2, 4}至少匹配2位数字,但不超过4位数字

表达 细绳 配对?
[0-9]{2,4} ab123csde 1场比赛(在处比赛)ab123csde
12 and 345673 3个匹配(12345673
1 and 2 没有匹配

|交替

竖线|用于交替显示(or运算符)。

表达 细绳 配对?
a|b cde 没有匹配
ade 1场比赛(在处比赛ade
acdbea 3场比赛(在)acdbea

在这里,a|b匹配包含以下任意一个的字符串一种 或者 b


()

括号()用于对子模式进行分组。例如,(a|b|c)xz匹配与以下任何一个匹配的字符串一种 或者 b 或者 C 其次是 z

表达 细绳 配对?
(a|b|c)xz ab xz 没有匹配
abxz 1场比赛(在处比赛)abxz
axz cabxz 2场比赛(在)axzbc cabxz

\反斜杠

反冲\用于转义包括所有元字符在内的各种字符。例如,

\$a如果字符串包含$后跟则匹配a。在此,$RegEx引擎不会以特殊方式对其进行解释。

如果不确定某个字符是否具有特殊含义,可以将其\放在前面。这样可以确保不对字符进行特殊处理。


特殊序列

特殊序列使常用模式更易于编写。以下是特殊序列的列表:

\A -如果指定字符在字符串的开头,则匹配。

表达 细绳 配对?
\Athe the sun 比赛
In the sun 没有匹配

\b -如果指定字符在单词的开头或结尾,则匹配。

表达 细绳 配对?
\bfoo football 比赛
a football 比赛
afootball 没有匹配
foo\b the foo 比赛
the afoo test 比赛
the afootest 没有匹配

\B-对面\b。如果指定的字符不在单词的开头或结尾,则匹配。

表达 细绳 配对?
\Bfoo football 没有匹配
a football 没有匹配
afootball 比赛
foo\B the foo 没有匹配
the afoo test 没有匹配
the afootest 比赛

\d-匹配任何十进制数字。相当于[0-9]

表达 细绳 配对?
\d 12abc3 3场比赛(在)12abc3
Python 没有匹配

\D-匹配任何非十进制数字。相当于[^0-9]

表达 细绳 配对?
\D 1ab34"50 3场比赛(在)1ab34"50
1345 没有匹配

\s-匹配字符串包含任何空格字符的地方。等同于[ \t\n\r\f\v]

表达 细绳 配对?
\s Python RegEx 1场比赛
PythonRegEx 没有匹配

\S-匹配字符串包含任何非空白字符的地方。等同于[^ \t\n\r\f\v]

表达 细绳 配对?
\S a b 2场比赛(在) a b
    没有匹配

\w-匹配任何字母数字字符(数字和字母)。等同于[a-zA-Z0-9_]。顺便说一下,下划线_也被认为是字母数字字符。

表达 细绳 配对?
\w 12&": ;c 3场比赛(在)12&": ;c
%"> ! 没有匹配

\W-匹配任何非字母数字字符。相当于[^a-zA-Z0-9_]

表达 细绳 配对?
\W 1a2%c 1场比赛(在)1a2%c
Python 没有匹配

\Z -如果指定的字符位于字符串的末尾,则匹配。

表达 细绳 配对?
Python\Z I like Python 1场比赛
I like Python Programming 没有匹配
Python is fun. 没有匹配

提示:要构建和测试正则表达式,可以使用RegEx测试器工具,例如regex101。该工具不仅可以帮助您创建正则表达式,还可以帮助您学习它。

现在,您了解了RegEx的基础知识,让我们讨论如何在Python代码中使用RegEx。


Python正则表达式

Python有一个名为re正则表达式的模块。要使用它,我们需要导入模块。

import re

该模块定义了一些可与RegEx一起使用的函数和常量。


re.findall()

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


示例1:re.findall()


# Program to extract numbers from a string

import re

string = 'hello 12 hi 89. Howdy 34'
pattern = '\d+'

result = re.findall(pattern, string) 
print(result)

# Output: ['12', '89', '34']

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


re.split()

re.split方法在存在匹配项的情况下拆分字符串,并返回发生拆分的字符串列表。


示例2:re.split()


import re

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

result = re.split(pattern, string) 
print(result)

# Output: ['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)

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

顺便说一下,默认值为maxsplit0;默认值为0。意味着所有可能的分裂。


re.sub()

的语法re.sub()为:

re.sub(pattern, replace, string)

该方法返回一个字符串,其中匹配的出现项被替换为 代替 多变的。


示例3:re.sub()


# 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)

# Output: abc12de23f456

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


你可以通过 数数作为该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)

# Output:
# abc12de 23
# f45 6

re.subn()

re.subn()以类似re.sub()指望它返回一个包含新字符串,并做出了换人的2个项目的元组


示例4:re.subn()


# 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.subn(pattern, replace, string) 
print(new_string)

# Output: ('abc12de23f456', 4)

研究()

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

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

match = re.search(pattern, str)

示例5:re.search()


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")  

# Output: pattern found inside the string

这里, 比赛 包含一个match对象。


匹配对象

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

匹配对象的一些常用方法和属性是:


match.group()

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

示例6:匹配对象


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")

# Output: 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()和match.span()

start()函数返回匹配的子字符串的开头的索引。同样,end()返回匹配的子字符串的结束索引。

>>> match.start()
2
>>> match.end()
8

span()函数返回一个包含匹配部分的开始和结束索引的元组。

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

match.re和match.string

re匹配对象的属性返回正则表达式对象。同样,stringattribute返回传递的字符串。

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

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

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


在RegEx之前使用r前缀

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

反冲\用于转义包括所有元字符在内的各种字符。但是,使用[R前缀使之\视为普通字符。


示例7:使用r前缀的原始字符串


import re

string = '\n and \r are escape sequences.'

result = re.findall(r'[\n\r]', string) 
print(result)

# Output: ['\n', '\r']

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站不拥有所有权,不承担相关法律责任。如发现有侵权/违规的内容, 联系QQ1841324605,本站将立刻清除。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

服务热线:130-0886-1890

QR code