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')]