Python瓦匠 —— 正则表达式(二)
利用正则表达式匹配更多模式
一 利用括号分组
括号可以将正则表达式分组,然后使用group()方法分组的获取匹配的文本。
上节的例子:
import re #匹配字符串中的电话号码。 c = 'My phone number is 234-345-3333' phoneNumber = re.compile(r'(\d{3})-(\d{3}-\d{4})')#获取Regex对象。 mo = phoneNumber.search(c)#查找传入的字符串。 print('Phone Number is ' + mo.group())#group()函数返回匹配到的文本。 print('Phone Number is ' + mo.group(0))#同上。 print('Phone Number is ' + mo.group(1))#匹配第一组。 print('Phone Number is ' + mo.group(2))#匹配第二组。
运行结果如下:
Phone Number is 234-345-3333 Phone Number is 234-345-3333 Phone Number is 234 Phone Number is 345-3333
如果你想要一次性获得所有的分组,可以使用groups()方法,但记住groups()方法返回的是元组,需要获得其中的值才可已打印。
例如:
first,second = mo.groups() print('Phone Number is' + first) print('Phone Number is' + second)
运行结果是:
Phone Number is234
Phone Number is345-3333
二 用管道匹配多个分组
字符|被称为“管道”。当我们需要匹配多个字符串中的一个的时候,可以使用到管道:r'Beijin|Shanghai' , 将匹配'Brijin'或者'Shanghai'。
注:如果Beijin Shanghai 都出现在要匹配的字符串中,第一次出现的匹配文本将作为Match对象返回。
import re city = re.compile(r'Beijin|Shanghai') mo = city.search('I like Beijin,but I live in Shanghai.') print('Firsr city;' + mo.group()) #调换了语序之后。 mo = city.search('I live in Shanghai,but I like Beijin.') print('First city: ' + mo.group())
运行结果:
Firsr city;Beijin
First city: Shanghai
>>>
三 用问号实现可选匹配
当匹配的模式可选的时候(有就匹配没有就不匹配),我们可以使用问号,例如:
import re city = re.compile(r'Shanghai(city)?') mo = city.search('Shanghai') #不包含city。 print(mo.group()) mo = city.search('Shanghaicity') #包含city。 print(mo.group())
运行结果:
Shanghai
Shanghaicity
可以这么理解:()?表示匹配这个问号之前的分组0次或者1次。
四 用星号 * 匹配0次或多次
()*表示星号之前的分组可以再文本中出现0次或者多次。
我们可以将上个例子小小的改动一下:
import re city = re.compile(r'Shanghai(city)*')#匹配星号前的模式0次或多次。 mo = city.search('Shanghai') #不包含city。 print(mo.group()) mo = city.search('Shanghaicitycity') #包含两个city。 print(mo.group())
运行结果:
Shanghai
Shanghaicitycity
>>>
五 用加号匹配一次或多次:
()+ : 加号前面的分组必须出现一次或一次以上。
import re city = re.compile(r'Shanghai(city)+') mo = city.search('Shanghaicitycity') #包含city。 print(mo.group()) mo = city.search('Shanghai') #不包含city,在交互式环境下显示None。 print(mo.group())
运行结果:
Shanghaicitycity #idle的Shell中。 None >>>
六 用花括号匹配特定字数
{ }:表示分组特定次数。
- {3}匹配三次。
- {3,5}表示匹配3到5次。
- {,5}表示0到5次。
- {5,}表示5或5次以上。
import re city = re.compile(r'Shanghai(city){,5}')#匹配0到5次。 mo = city.search('Shanghai') #不包含city。 print(mo.group()) mo = city.search('Shanghaicitycitycitycitycity') #包含city。 print(mo.group())
运行结果:
Shanghai
Shanghaicitycitycitycitycity
>>>