注:Regex对象的search()方法只找到字符串中出现的第一个符合正则表达式的部分,如果想要找到所有符合正则表达式的部分,可以用findall()方法,findall()方法返回一个列表。
import re phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d') numList = phoneNumRegex.findall('Cell: 415-555-9999 Work: 212-555-0000') for num in numList: print(num) #运行结果 #415-555-9999 #212-555-00001、利用括号分组(\d\d\d)-(\d\d\d-\d\d\d\d)。然后可以使用group()匹配对象方法,从一个分组中获取匹配的文本。 正则表达式字符串中的第一对括号是第1组。第二对括号是第2组。向group()匹配对象方法传入整数1或2,就可以取得匹配文本的不同部分。向group()方法传入0或不传入参数,将返回整个匹配的文本。
import re 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)) #结果415 print(mo.group(2)) #结果555-4242 print(mo.group(0)) #结果415-555-4242 print(mo.group()) #结果415-555-42422、用管道匹配多个分组。字符|称为“管道”。希望匹配许多表达式中的一个时,就可以使用它。例如, 正则表达式r'Batman|Tina Fey'将匹配'Batman'或'Tina Fey'。
import re heroRegex = re.compile (r'Batman|Tina Fey') mo1 = heroRegex.search('Batman and Tina Fey.') print(mo1.group()) #运行结果Batman3、用问号实现可选匹配。字符?表明它前面的分组在这个模式中是可选的。
import re batRegex = re.compile(r'Bat(wo)?man') mo1 = batRegex.search('The Adventures of Batman') print(mo1.group()) #运行结果:Batman mo2 = batRegex.search('The Adventures of Batwoman') print(mo2.group()) #运行结果:Batwoman4、用星号匹配零次或多次。*意味着“匹配零次或多次”,即星号之前的分组。
5、用加号匹配一次或多次。+意味着“匹配一次或多次”
import re batRegex = re.compile(r'Bat(wo)*man') mo1 = batRegex.search('The Adventures of Batman') print(mo1.group()) #运行结果:Batman mo2 = batRegex.search('The Adventures of Batwoman') print(mo2.group()) #运行结果:Batwoman mo3 = batRegex.search('The Adventures of Batwowowowoman') print(mo3.group()) #运行结果:Batwowowowoman bat2Regex = re.compile(r'Bat(wo)+man') moo2 = bat2Regex.search('The Adventures of Batwowowowoman') print(moo2.group()) #运行结果:Batwowowowoman mooo3 = bat2Regex.search('The Adventures of Batman') print(mooo3 == None) #运行结果:True6、用花括号匹配特定次数。正则表达式(Ha){3}将匹配字符串'HaHaHa',但不会匹配'HaHa', 因为后者只重复了(Ha)分组两次
import re haRegex = re.compile(r'(Ha){3}') mo1 = haRegex.search('HaHaHa') mo1.group() 'HaHaHa'