文章目录
不用正则表达式来查找文本模式
假设你希望在字符串中查找电话号码。你知道模式:3 个数字,一个短横线,3 个数字,一个短横线,再是 4 个数字。例如: 415-555-4242.
假定我们用一个名为 isPhoneNumber() 的函数,来检查字符串是否匹配模式,它返回 True 或 False.
def isPhoneNumber(text):
if len(text) != 12:
return False
for i in range(0, 3):
if not text[i].isdecimal():
return False
if text[3] != '-':
return False
for i in range(4, 7):
if not text[i].isdecimal():
return False
if text[7] != '-':
return False
for i in range(8, 12):
if not text[i].isdecimal():
return False
return True
print('415-555-4212 is a phone number:')
print(isPhoneNumber(('415-555-4212')))
print('Moshi moshi is a phone number:')
print(isPhoneNumber('Moshi moshi'))
415-555-4212 is a phone number:
True
Moshi moshi is a phone number:
False
用正则表达式查找文本模式
正则表达式,简称为 regex,是文本模式的描述方法。例如:\d 是一个正则表达式,表示一位数字字符,及任何一位 0 到 9 的数字。python 使用正则表达式 \d\d\d-\d\d\d-\d\d\d\d,来匹配前面 isPhoneNumber() 函数匹配的同样文本。
创建正则表达式对象
python 中所有正则表达式的函数都在 re 模块中。
>>> import re
向 re.compile() 传入一个字符串,表示正则表达式,它将返回一个 Regex 模式对象。
要创建一个 Regex 对象来匹配电话号码模式,可以在交互式环境中输入以下代码:
>>> phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
匹配 Regex 对象
Regex 对象的 search() 方法查找传入的字符串,寻找该正则表达式的所有匹配。如果字符串中没有找到该正则表达式模式,search() 方法将返回 None.如果找到了该模式,search() 方法将返回一个 Match 对象。Match 对象有一个 group() 方法,它返回被查找字符串中实际匹配的文本。
>>> phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
>>> mo = phoneNumRegex.search('My number is 415-555-4242.')
>>> print('Phone number found: ' + mo.group())
Phone number found: 415-555-4242
向 re.compile() 传递原始字符串 通过在字符串的第一个引号之前加上
r,可以将字符串标记为原始字符串,它不包括转义字符。输入r'\d\d\d-\d\d\d-\d\d\d\d',比输入'\\d\\d\\d-\\d\\d\\d-\\d\\d\\d\\d'要容易得多。
正则表达式匹配复习
- 用
import re导入正则表达式模块 - 用
re.compile()函数创建一个Regex对象(记得使用原始字符串) - 向
Regex对象的search()方法传入想查找的字符串,它返回一个Match对象 - 调用
Match对象的group()方法,返回实际匹配文本的字符串。
用正则表达式匹配更多模式
利用括号分组
假定想要将区号从电话号码中分离。添加括号将在正则表达式中创建“分组”:(\d\d\d)-(\d\d\d-\d\d\d\d).然后可以使用 group() 匹配对象方法,从一个分组中获取匹配的文本。
正则表达式字符串中的第一对括号是第 1 组,第二对括号是第 2 组。向 group() 匹配对象方法传入整数 1 或 2,就可以取得匹配文本的不同部分。向 group() 方法传入 0 或不传入参数,将返回整个匹配的文本。
>>> phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)')
>>> mo =phoneNumRegex.search('My number is 415-555-4242.')
>>> mo.group(1)
'415'
>>> mo.group(2)
'555-4242'
>>> mo.group(0)
'415-555-4242'
>>> mo.group()
'415-555-4242'
如果想要一次就获取所有的分组,请使用 groups() 方法。
>>> mo.groups()
('415', '555-4242')
>>> areaCode, mainNumber = mo.groups()
>>> print(areaCode)
415
>>> print(mainNumber)
555-4242
>>> type(mo.groups())
<class 'tuple'>
本文介绍了如何使用正则表达式进行文本模式查找,从基础的创建正则表达式对象到复杂的模式匹配,如括号分组、可选匹配、重复次数控制等。通过实例展示了如何在Python中使用`re`模块进行正则操作,包括创建Regex对象、使用search()方法查找匹配,并提取分组信息。此外,还提到了正则表达式的贪婪与非贪婪匹配概念。
725

被折叠的 条评论
为什么被折叠?



