python 之模式匹配与正则表达式

本文介绍了如何使用正则表达式进行文本模式查找,从基础的创建正则表达式对象到复杂的模式匹配,如括号分组、可选匹配、重复次数控制等。通过实例展示了如何在Python中使用`re`模块进行正则操作,包括创建Regex对象、使用search()方法查找匹配,并提取分组信息。此外,还提到了正则表达式的贪婪与非贪婪匹配概念。

不用正则表达式来查找文本模式

假设你希望在字符串中查找电话号码。你知道模式:3 个数字,一个短横线,3 个数字,一个短横线,再是 4 个数字。例如: 415-555-4242.
假定我们用一个名为 isPhoneNumber() 的函数,来检查字符串是否匹配模式,它返回 TrueFalse.

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' 要容易得多。

正则表达式匹配复习

  1. import re 导入正则表达式模块
  2. re.compile() 函数创建一个 Regex 对象(记得使用原始字符串)
  3. Regex 对象的 search() 方法传入想查找的字符串,它返回一个 Match 对象
  4. 调用 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'>

用管道匹配多个分组

用问号实现可选匹配

用星号匹配零次或多次

用加号匹配一次或多次

用花括号匹配特定次数

贪心和非贪心匹配

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值