>>> from env_helper import info; info()
页面更新时间: 2024-03-29 09:19:09
运行环境:
Linux发行版本: Debian GNU/Linux 12 (bookworm)
操作系统内核: Linux-6.1.0-18-amd64-x86_64-with-glibc2.36
Python版本: 3.11.2
1.2. 使用正则表达式对象¶
Python 中所有正则表达式的函数都在 re
模块中。在交互式环境中输入以下代码,导入该模块:
>>> import re
re
模块的 compile()
函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。
该对象拥有一系列方法用于正则表达式匹配和替换。 例如,向 re.compile()
传入一个字符串值表示正则表达式, 它将返回一个 Regex
模式对象(简称为
Regex
对象)。
要创建一个 Regex
对象来匹配电话号码模式,
就在交互式环境中输入以下代码。
>>> regobj = re.compile('\d\d\d-\d\d\d-\d\d\d\d')
现在 regobj
变量包含了一个 Regex
对象。
1.2.1. 匹配 Regex
对象¶
Regex
对象的 search()
方法查找传入的字符串,寻找该正则表达式的所有匹配。
如果字符串中没有找到该正则表达式模式,search()
方法将返回None
。 如果找到了该模式,search()
方法将返回一个
Match
对象。 Match
对象有一个 group()
方法,它返回被查找字符串中实际匹配的文本。
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'
要容易得多。
1.2.2. re.match() 函数¶
re.match()
尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,
match()
就返回 None
。
函数语法:
re.match(pattern, string, flags=0)
函数参数说明:
pattern
匹配的正则表达式string
要匹配的字符串。flags
标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
我们可以使用 group(num)
或 groups()
匹配对象函数来获取匹配表达式。
group(num=0)
匹配的整个表达式的字符串,group()
可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。groups()
返回一个包含所有小组字符串的元组,从1
到 所含的小组号。
实例 1:
在起始位置匹配
>>> print(re.match('www', 'www.runoob.com').span())
(0, 3)
不在起始位置匹配
>>> print(re.match('com', 'www.runoob.com'))
None
1.2.3. re.match
与 re.search
的区别¶
re.match
只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回
None
; 而 re.search
匹配整个字符串,直到找到一个匹配。
实例:
>>> 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!!")
>>>
>>> matchObj = re.search( r'dogs', line, re.M|re.I)
>>> if matchObj:
>>> print ("search --> matchObj.group() : ", matchObj.group())
>>> else:
>>> print ("No match!!")
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)
1.2.4. 正则表达式匹配复习¶
虽然在 Python中使用正则表达式有几个步骤, 但每一步都相当简单。
用
import re
导入正则表达式模块。
用
re.compile()
函数创建一个Regex
对象(记得使用原始字符串)。向
Regex
对象的search()
方法传入想查找的字符串。它返回一个Match
对象。调用
Match
对象的group()
方法,返回实际匹配文本的字符串。