上一章Python教程请查看:python3 @property的用法
在本教程中,你将了解正则表达式(RegEx),并使用Python的re模块使用RegEx(通过示例的帮助你理解)。
正则表达式(RegEx)是定义搜索模式的字符序列,例如:
^a...s$
上面的代码定义了一个RegEx模式,这个模式是:任何五个字母的字符串,以a开头,以s结尾。
使用RegEx定义的模式可用于匹配字符串。
表达式 | String | 匹配? |
^a… s$ | abs | 不匹配 |
alias | 匹配 | |
abyss | 匹配 | |
Alias | 不匹配 | |
An abacus | 不匹配 |
import re
pattern = '^a...s$'
test_string = 'abyss'
result = re.match(pattern, test_string)
if result:
print("搜索成功")
else:
print("搜索失败")
这里,我们使用re.match()函数来搜索test_string中的模式,如果搜索成功,该方法将返回一个匹配对象,如果没有,则返回None。
在re模块中还定义了其他几个函数来使用RegEx,在探讨这个问题之前,让我们先了解一下正则表达式本身。
使用RegEx指定模式要指定正则表达式,需要使用元字符,在上面的例子中,^和$是元字符。
元字符
元字符是由RegEx引擎以特殊方式解释的字符。以下是元字符列表:
[] . ^ $ * + ?{} () \ |
[] -方括号
方括号指定要匹配的一组字符。
表达式 | String | 匹配? |
[abc] | a | 匹配一个 |
ac | 匹配两个 | |
Hey Jude | 不匹配 | |
abc de ca | 匹配5个 |
还可以使用方括号内的-指定字符范围。
- [a-e]和[abcde]是一样的。
- [1-4]与[1234]相同。
- [0-39]与[01239]相同。
- [^abc]指除a、b或c之外的任何字符。
- [^0-9]表示任何非数字字符。
句点匹配任何单个字符(换行’ \n’ 除外)。
表达式 | String | 匹配? |
.. | a | 不匹配 |
ac | 1匹配 | |
acd | 1匹配 | |
acde | 2个匹配(包含4个字符) |
插入符号^用于检查字符串是否以某个字符开头。
表达式 | String | 匹配? |
^a | a | 1匹配 |
abc | 1匹配 | |
bac | 不匹配 | |
^ab | abc | 1匹配 |
acb | 不匹配(始于一个但不跟着b) |
美元符号$用于检查字符串是否以某个字符结束。
表达式 | String | 匹配? |
a$ | a | 1匹配 |
formula | 1匹配 | |
cab | 不匹配 |
星号*匹配零次或多次出现的模式。
表达式 | String | 匹配? |
ma*n | mn | 1匹配 |
man | 1匹配 | |
maaan | 1匹配 | |
main | 不匹配(不跟着n) | |
woman | 1匹配 |
“+”符号与留给它的一个或多个模式匹配。
表达式 | String | 匹配? |
ma+n | mn | 不匹配(没有一个字符) |
man | 1匹配 | |
maaan | 1匹配 | |
main | 不匹配(不跟着n) | |
woman | 1匹配 |
问号符号?匹配模式左移的零次或一次匹配。
表达式 | String | 匹配? |
ma?n | mn | 1匹配 |
man | 1匹配 | |
maaan | 不匹配(超过一个字符) | |
main | 不匹配(不跟着n) | |
woman | 1匹配 |
考虑以下代码:{n,m},这意味着至少要重复n次,最多要重复m次。
表达式 | String | 匹配? |
a{2,3} | abc dat | 不匹配 |
abc daat | 1匹配(at daat) | |
aabc daaat | 2匹配(aabc和daaat) | |
aabc daaaat | 2匹配(aabc和daaaat) |
表达式 | String | 匹配? |
[0-9]{2,4} | ab123csde | 1匹配 |
12 and 345673 | 2 匹配 | |
1 and 2 | 不匹配 |
竖线|用于交替(或操作符)。
表达式 | String | 匹配? |
a|b | cde | 不匹配 |
ade | 1 匹配 | |
acdbea | 3匹配 |
()——组合
圆括号()用于分组子模式,例如,(a|b|c)xz匹配任何匹配a、b或c后面跟xz的字符串
表达式 | String | 匹配? |
(a|b|c)xz | ab xz | 不匹配 |
abxz | 1匹配 | |
axz cabxz | 2匹配 |
反作用力用于转义各种字符,包括所有的元字符。例如,
如果一个字符串包含$后面跟一个,在这里,$不是由RegEx引擎以特殊的方式解释的。
如果你不确定一个字符是否有特殊含义,你可以把\放在它前面。这就确保了角色不会被特殊对待。
特殊的序列
特殊的序列使常用的模式更容易编写,下面是一些特殊的序列:
如果指定的字符位于字符串的开头,则匹配。
表达式 | String | 匹配? |
\Athe | the sun | 匹配 |
In the sun | 不匹配 |
表达式 | String | 匹配? |
\bfoo | football | 匹配 |
a football | 匹配 | |
afootball | 不匹配 | |
foo\b | the foo | Match |
the afoo test | 匹配 | |
the afootest | 不匹配 |
现在你已经了解了RegEx的基础知识,接下来让我们讨论如何在Python代码中使用RegEx。
Python正则表达式Python有一个名为re的模块来处理正则表达式,要使用它,我们需要导入模块。
import re
该模块定义了几个函数和常量来使用RegEx。
re.findall ()
findall()方法返回包含所有匹配项的字符串列表。
示例1:re.findall ()
# 从字符串中提取数字的程序
import re
string = 'hello 12 hi 89. Howdy 34'
pattern = '\d+'
result = re.findall(pattern, string)
print(result)
# 输出: ['12', '89', '34']
如果没有找到模式,re.findall()将返回一个空列表。
re.split ()
split方法对匹配的字符串进行拆分,并返回发生拆分的字符串列表。
示例2: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
# 只在第一次出现时分拆
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变量的内容。
示例3:re.sub ()
# 程序删除所有空白
import re
# 多行字符串
string = 'abc 12\
de 23 \n f45 6'
# 匹配所有空白字符
pattern = '\s+'
# 空字符串
replace = ''
new_string = re.sub(pattern, replace, string)
print(new_string)
# 输出: abc12de23f456
如果没有找到模式,re.sub()将返回原始字符串。
你可以将count作为第四个参数传递给re.sub()方法,如果省略,结果是0,这将替换所有发生的事件。
import re
# 多行字符串
string = 'abc 12\
de 23 \n f45 6'
# 匹配所有空白字符
pattern = '\s+'
replace = ''
new_string = re.sub(r'\s+', replace, string, 1)
print(new_string)
# 输出:
# abc12de 23
# f45 6
re.subn ()
subn()类似于re.sub(),期望它返回一个元组,包含2个条目,其中包含新字符串和替换的数量。
示例4:re.subn ()
# 程序删除所有空白
import re
# 多行字符串
string = 'abc 12\
de 23 \n f45 6'
# 匹配所有空白字符
pattern = '\s+'
# 空字符串
replace = ''
new_string = re.subn(pattern, replace, string)
print(new_string)
# 输出: ('abc12de23f456', 4)
re.search ()
search()方法接受两个参数:一个模式和一个字符串,该方法查找RegEx模式生成与字符串匹配的第一个位置。
如果搜索成功,re.search()返回一个匹配对象,如果没有,则返回None。
match = re.search(pattern, str)
示例5:re.search ()
import re
string = "Python is fun"
# 检查’Python’是否在首部
match = re.search('\APython', string)
if match:
print("在字符串中发现模式")
else:
print("找不到模式")
# 输出: 在字符串中发现模式
在这里,match包含一个match对象。
匹配对象可以使用dir()函数获取匹配对象的方法和属性。
一些常用的方法和属性的匹配对象是:
match.group ()
方法的作用是:返回字符串中匹配的部分。
示例6:匹配对象
import re
string = '39801 356, 2102 1111'
# 三位数,空格,两位数
pattern = '(\d{3}) (\d{2})'
# 匹配变量包含一个匹配对象。
match = re.search(pattern, string)
if match:
print(match.group())
else:
print("找不到模式")
# 输出: 801 35
这里,match变量包含一个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 and match.string
匹配对象的re属性返回一个正则表达式对象,类似地,string属性返回传递的字符串。
>>> match.re
re.compile('(\\d{3}) (\\d{2})')
>>> match.string
'39801 356, 2102 1111'
我们已经介绍了re模块中定义的所有常用方法,如果你想了解更多,请访问Python 3 re模块。
在正则表达式前使用r前缀
当在正则表达式前使用r或r前缀时,它表示原始字符串。例如,’ \n’ 是一个新行,而r’ \n’ 表示两个字符:一个反斜杠\后跟n。
【python3正则表达式 – Python3教程】反作用力用于转义各种字符,包括所有的元字符。但是,使用r前缀会使\视为正常字符。
推荐阅读
- python3处理时间和日期(datetime模块 – Python3教程)
- python3 @property的用法 – Python3教程
- python3装饰器decorator – Python3教程
- python3闭包closure – Python3教程
- python3生成器generator – Python3教程
- python3迭代器iterator – Python3教程
- 六大算法设计技巧(贪婪法、分治法、动态规划、随机化算法、回溯法和分支限界法)
- python3运算符重载 – Python3教程
- python3多重继承 – Python3教程