Python 正则表达式,实战篇!

整理自: Automate the Boring Stuff with Python
作者: Al Sweigart

1. 创建正则表达式对象和匹配Regex对象

re.compile() 传入一个字符串值,表示正则表达式,它将返回一个 Regex 模式 对象(或者就简称为 Regex 对象)。Regex 对象的 search() 方法查找传入的字符串,寻找该正则表达式的所有匹配。如果字符串中没有找到该正则表达式模式,search() 方法将返回 None。如果找到了该模式, search() 方法将返回一个 Match 对象。Match 对象有一个 group() 方法,它返回被查找字符串中实际匹配的文本。

import re
# 因为正则表达式常常使用倒斜杠,向 re.compile()函数传入原始字符串就很方便
# r: 忽略所有的转义字符,打印出字符串中所有的倒斜杠
phoneNumber = re.compile(r'\d{3}-\d{3}-\d{3}') # Regex 对象
mo = phoneNumber.search('Mu Number is 400-000-999') # 返回一个 Match 对象
mo.group()
>> '400-000-999'

2. 正则表达式匹配更多模式

2.1 利用括号分组

添加括号将在正则表达式中创建“分组”: (\d\d\d)-(\d\d\d-\d\d\d\d)。然后可以使用 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(mo.group(1))
print(mo.group(2))
#一次就获取所有的分组 
print(mo.groups())

>> 415-555-4242
>> 555-4242
>> ('415', '555-4242')

2.2 在文本中匹配括号

括号在正则表达式中有特殊的含义,但是如果你需要在文本中匹配括号,怎么办?例如,你要匹配的电话号码,可能将区号放在一对括号中。传递给 re.compile()的原始字符串中,(和)转义字符将匹配实际的括号字符。

 #phoneNumRegex = re.compile(r'(\(\d\d\d\)) (\d\d\d-\d\d\d\d)')
phoneNumRegex = re.compile(r'(\(\d{3}\)) (\d{3}-\d{4})')
mo = phoneNumRegex.search('My phone number is (415) 555-4242.')
print(mo.group(1))
>> (415)

3. 用管道匹配多个分组

字符 | 称为 管道。希望匹配许多表达式中的一个时,就可以使用它。例如, 正则表达式 r**Batman | Tina Fey **将匹配 BatmanTina Fey。 如果 BatmanTina Fey 都出现在被查找的字符串中,第一次出现的匹配文本, 将作为 **Match **对象返回。

heroRegex = re.compile(r'Brain|head') # 中间不要有空格,不然第二个打印报错
mo1 = heroRegex.search('Brain and head')
print(mo1.group())
mo2 = heroRegex.search('head and Brain')
mo2.group()
print(mo2.group())

>> Brain
>> head

3.1 匹配多个模式中的一个

batRegex = re.compile(r'Bat(man|mobile|copter|bat)')
mo = batRegex.search('Batmobile lost a wheel')
print(mo.group())
print(mo.group(1)) # 只是返 回第一个括号分组内匹配的文本'mobile'
print(mo.groups())

>> Batmobile
>> mobile
>> ('mobile',)

4. 用问号实现可选匹配:

匹配的模式是可选的。就是说,不论这段文本在不在,正则表达式 都会认为匹配。字符 ? 表明它前面的分组在这个模式中是可选的,如果需要匹配真正的问号字符,就使用转义字符 \?

batRegex = re.compile(r'Bat(wo)?man')
mo1 = batRegex.search('The Adventures of Batman')
print(mo1.group())
mo2 = batRegex.search('The Adventures of Batwoman')
print(mo2.group())
print(mo2.group(1)) # 这个才有分组,因为匹配的对象有:“wo”;  (wo)?部分表明,模式 wo 是可选的分组

>> Batman
>> Batwoman
>> wo

4.1.1 让正则表达式寻找包含区号或不包含区号的电话号码

phoneRegex = re.compile(r'(\d{3}-)?\d{3}-\d{4}')
mo1 = phoneRegex.search('My Number is 411-234-4566')
# 建议都打出来看看
print(mo1.group())
print(mo1.group(1))
print(mo1.groups())

mo2 = phoneRegex.search('My Number is 222-3445')
print(mo2.group())
print(mo2.group(1)) # 没有可选的组,为None
print(mo2.groups()) # 同上

>> 411-234-4566
>> 411-
>> ('411-',)
>> 222-3445
>> None
  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值