Python 中所有正则表达式的函数都在 re
模块中。在交互式环境中输入以下代码,导入该模块:
import re
re
模块的 compile()
函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。
该对象拥有一系列方法用于正则表达式匹配和替换。
例如,向 re.compile()
传入一个字符串值表示正则表达式,
它将返回一个 Regex
模式对象(简称为 Regex
对象)。
要创建一个 Regex
对象来匹配电话号码模式,
就在交互式环境中输入以下代码。
regobj = re.compile('\d\d\d-\d\d\d-\d\d\d\d')
<>:1: SyntaxWarning: invalid escape sequence '\d' <>:1: SyntaxWarning: invalid escape sequence '\d' /tmp/ipykernel_613/2084049254.py:1: SyntaxWarning: invalid escape sequence '\d' regobj = re.compile('\d\d\d-\d\d\d-\d\d\d\d')
re.search
方法
re.search
扫描整个字符串并返回第一个成功的匹配。
函数语法:
re.search(pattern, string, flags=0)
函数参数说明:
参数 | 描述
pattern
| 匹配的正则表达式。string
| 要匹配的字符串。flags
| 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
匹配成功 re.search
方法返回一个匹配的对象,否则返回 None
。
可以使用 group(num)
或 groups()
匹配对象函数来获取匹配表达式。
匹配对象方法 | 描述
group(num=0)
|匹配的整个表达式的字符串,group()
可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。groups()
| 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。
例如,在交互式环境中输入以下代码:
mo = regobj.search('My number is 415-555-4242.')
print('Phone number found: ' + mo.group())
Phone number found: 415-555-4242
变量名 mo
是一个通用的名称,用于 Match
对象。
这里,将期待的模式传递给 re.compile()
,并将得到的 Regex
对象保存在 phoneNumRegex
中。
然后在 phoneNumRegex
上调用 search()
,向它传入想查找的字符串。查找的结果保存在变量 mo
中。
在这个例子里,模式会在这个字符串中找到,所以知道会返回一个 Match
对象。
知道 mo
包含一个 Match
对象,而不是空值 None
,就可以在 mo
变量上调用 group()
,返回匹配的结果。
将 mo.group()
写在打印语句中,显示出完整的匹配,即 415-555-4242
。
如果对象没找到,可以进行判断:
mo2 = regobj.search('my number is 41555433.')
print('got') if mo2 else print('not got')
not got
向 re.compile()
传递原始字符串
回忆一下, Python 中转义字符使用倒斜杠( \
)。
字符串 V
表示一个换行字符,
而不是倒斜杠加上一个小写的 n
。
需要输入转义字符 \\
,才能打印出一个倒斜杠。
所以 '\n'
表示一个倒斜杠加上一个小写的 n
。
但是,通过在字符串的第一个引号之前加上 r
,
可以将该字符串标记为原始字符串,它不包括转义字符。
因为正则表达式常常使用倒斜杠,
向 re.compile()
函数传入原始字符串就很方便,
而不是输入额外得到斜杠。输入 r'\d\d\d-\d\d\d-\d\d\d\d'
,
比输入 '\\d\\d\\d-\\d\\d\\d-\\d\\d\\d\\d'
要容易得多。
re.match()
函数
re.match()
尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话, match()
就返回 None
。
函数语法:
re.match(pattern, string, flags=0)
函数参数说明:
pattern
匹配的正则表达式string
要匹配的字符串。flags
标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
可以使用 group(num)
或 groups()
匹配对象函数来获取匹配表达式。
group(num=0)
匹配的整个表达式的字符串,group()
可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。groups()
返回一个包含所有小组字符串的元组,从1
到 所含的小组号。
实例:
在起始位置匹配:
print(re.match('www', 'www.runoob.com').span())
(0, 3)
不在起始位置匹配:
print(re.match('com', 'www.runoob.com'))
None
import re
line = "Cats are smarter than dogs";
matchObj = re.match( 'dogs', line, re.M|re.I)
if matchObj:
print ("match --> matchObj.group() : ", matchObj.group())
else:
print ("No match!!")
No match!!
matchObj = re.search( r'dogs', line, re.M|re.I)
if matchObj:
print ("search --> matchObj.group() : ", matchObj.group())
else:
print ("No match!!")
search --> matchObj.group() : dogs
再看一下 search()
函数的一些示例:
在起始位置匹配:
re.search('www', 'www.runoob.com').span()
(0, 3)
不在起始位置匹配:
re.search('com', 'www.runoob.com').span()
(11, 14)