1、查找电话号码
#! coding=utf-8
import re
"""查找字符串中的文本"""
txt="your number is 415-555-4242,your name is yy,her number is 131-129-9909"
phoneNumRex=re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')#/d匹配一个数字
phoneNum=re.search(phoneNumRex,txt)
print (phoneNum.group())
结果:415-555-4242
只会匹配第一个电话号码
2、利用括号分组
#! coding=utf-8 import re """查找字符串中的文本""" txt="your number is 415-555-4242,your name is yy,her number is 131-129-9909" phoneNumRex=re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)')#加上括号进行分组 phoneNum=re.search(phoneNumRex,txt) print (phoneNum.group()) print (phoneNum.group(0)) print (phoneNum.group(1)) print (phoneNum.groups())#返回一个元祖
结果:
415-555-4242
415-555-4242
415
('415', '555-4242')
3、用管道匹配多个分组,如:r“a|b”将匹配字符a或b,如果a和b都出现,则第1次出现的匹配字符将作为返回对象
#! coding=utf-8 import re """查找字符串中的文本""" txt="your number is 415-555-4242,your name is yy,her number is 13112999091" phoneNumRex=re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)|[0-9]{11}')#匹配两种情况 phoneNum=re.search(phoneNumRex,txt) print (phoneNum.group())
结果:415-555-4242
如果将txt中的13112999091放在415-55-4242前面,将首先匹配13112999091
#! coding=utf-8 import re """查找字符串中的文本""" txt="your number is13112999091 ,your name is yy,her number is 415-555-4242" phoneNumRex=re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)|[0-9]{11}')#匹配两种情况 phoneNum=re.search(phoneNumRex,txt) print (phoneNum.group())
结果:13112999091
4、?号匹配前面的字符出现1次或0次
#! coding=utf-8 import re """查找字符串中的文本""" txt="your number is13112999091 ,your name is zhang,her number is 415-555-4242" phoneNumRex=re.compile(r'zhang(san)?')#匹配两种情况,zhang或zhangsan phoneNum=re.search(phoneNumRex,txt) print (phoneNum.group())
结果:zhang
5、*匹配前面出现字符的零次或多次
#! coding=utf-8 import re """查找字符串中的文本""" txt="your number is13112999091 ,your name is zhang,her number is 415-555-4242" phoneNumRex=re.compile(r'zhang(san)*')#匹配两种情况,zhang或zhangsan phoneNum=re.search(phoneNumRex,txt) print (phoneNum.group())
结果:zhang
6、+匹配前面出现字符的一次或多次,如:aa(bc)+将匹配aabc或aabcbc或aabcbcbc...
7、用花括号匹配特定次数,如:aa(bb){4}将匹配aabbbbbbbb
8、贪心匹配,(ab){3,5}表示可以匹配ab重复3或5次,但当查找的字符串为ababababab,匹配到的是ababababab,而不是ababab,原因是在有二义的情况下,会尽可能的匹配最长的字符串
例子:
#! coding=utf-8 import re """查找字符串中的文本""" txt="ababababab" phoneNumRex=re.compile(r"(ab){3,5}") phoneNum=re.search(phoneNumRex,txt) print (phoneNum.group())
结果:ababababab
如果在{3,5}后加上一个?,如:(ab){3,5}?则便成了非贪心模式,将匹配ababab
所以问号在正则表达式中可能有两种含义,一种是申明非贪心匹配,一种是匹配前面的字符出现1次或0次
9、findall()方法和search方法的区别
findall方法返回的一组字符串,包含所查找字符串中的所有匹配,而search返回的只包含了第一次出现的匹配的文本
findall返回的是一个字符串列表,而search返回的是一个Match对象
例子:
#! coding=utf-8 import re """查找字符串中的文本""" txt="your number is 131-129-9909 ,your name is zhang,her number is 415-555-4242" phoneNumRex=re.compile(r"\d\d\d-\d\d\d-\d\d\d\d") phoneNum=re.findall(phoneNumRex,txt) print (phoneNum)
结果:
['131-129-9909', '415-555-4242']
如果正则表达式中有分组,findall将返回元祖的列表,如下:
#! coding=utf-8 import re """查找字符串中的文本""" txt="your number is 131-129-9909 ,your name is zhang,her number is 415-555-4242" phoneNumRex=re.compile(r"(\d\d\d)-(\d\d\d-\d\d\d\d)") phoneNum=re.findall(phoneNumRex,txt) print (phoneNum)
结果:
[('131', '129-9909'), ('415', '555-4242')]