re正則表達式的使用


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM