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
>>> 

 

posted @ 2018-02-02 17:44  未来分析师  阅读(151)  评论(0编辑  收藏  举报