Python:正則匹配知識點

修飾符分類

\w:數字,字母,下劃線
\d:阿拉伯數字
\s:空白字符:換行,空格,製表符
[]: 一組字符
():分組字符
(|) :任一字符;管道字符|
()?:可選匹配
{}?:非貪心匹配
重複修飾符: (*, +, ?, {m,n}..)
{}:字符個數或範圍
* :>=0次
+ :>=1次
. :通配符
.*:除換行的所有字符

匹配方法

.search(): 查找單次首次匹配
.findall():所有匹配字符串列表(元組group)
.sub():取代查找和替換

compile 第二參數:

.*匹配所有字符包括換行 : re.DOTALL
忽略大小寫 : re.I  ||  re.IGNORECASE
忽略空白符和註解: re.VERVOSE

各項代碼

import re
'''字符分類
\w:數字,字母,下劃線
\d:阿拉伯數字
\s:空白字符:換行,空格,製表符
[]: 一組字符
():分組字符
(|) :任一字符;管道字符|
()?:可選匹配
{}?:非貪心匹配
重複修飾符: (*, +, ?, {m,n}..)
{}:字符個數或範圍
* :>=0次
+ :>=1次
. :通配符
.*:除換行的所有字符
'''
# 1.接觸re.compile() \d數字{個數};字符分類[]
print('1.接觸re.compile() \d數字{個數};字符分類[]',end='\n\n')
rule1= re.compile(r'(\d{3})-(\d{3}-\d{4})')
mo1= rule1.search('My number is 415-546-4556,dksi45-48-8')
print(mo1.group(1))
print(mo1.group(2))

# 2.1 匹配多個分組:|,顯示第一個出現的分組
print('2.1 匹配多個分組:|,顯示第一個出現的分組',end='\n\n')
rule2=re.compile(r'Batman|Tina Fey')
mo2=rule2.search('Batman and Tina Fey')
mo3=rule2.search('Tina Fey and Batman')
print(mo2.group(),mo3.group(),sep='\n')

# 2.2 相同前綴Bat(man|mobile|copter|bat)
print('2.2 相同前綴Bat(man|mobile|copter|bat)',end='\n\n')
rule3=re.compile(r'Bat(man|mobile|copter|bat)')
mo4=rule3.search('Batmobile lost a wheel,But Batman find it.')
print("group()".ljust(10,'.')+mo4.group().rjust(10))
print("group(1)".ljust(10,'.')+mo4.group(1).rjust(10))

# 3.  可選匹配:()?  ()內的內容可選
print('3.  可選匹配:()?  ()內的內容可選',end='\n\n')
rule4=re.compile(r'Bat(wo)?man')
mo5=rule4.search('TheAdventures of Batman')
mo6=rule4.search('TheAdventures of Batwoman')
print("()?".ljust(10,'.'),mo5.group(),mo6.group(),sep='\t')

# 4.  ()* 匹配可選次數
print('4.  ()* 匹配可選次數',end='\n\n')
rule5=re.compile(r'Bat(wo)*man')
mo7=rule5.search('Batwowowoman')
mo8=rule5.search('Batman')
print("(wo)*".ljust(10,'.'),mo7.group(),mo8.group(),sep='\t')

# 5.1 ()+ 匹配一次或者多次(至少出現一次)
print('5.1 ()+ 匹配一次或者多次(至少出現一次)',end='\n\n')
rule5=re.compile(r'Bat(wo)+man')
mo7=rule5.search('Batwowowoman')
mo8=rule5.search('Batman')
print("(wo)+".ljust(10,'.'),mo7.group(),"mo8==None :"+str(mo8==None),sep='\t')
# 5.2 \+ 需要匹配加號
print('5.2 \+ 需要匹配加號',end='\n\n')
rule5=re.compile(r'Bat(wo)*\+man')
mo7=rule5.search('Batwowowo+man')
mo8=rule5.search('Bat+man')
print("(wo)+".ljust(10,'.'),mo7.group(),mo8.group(),sep='\t')

# 6.1(){} 花括號特定次數或者範圍:(){3};(){3,5};(){,5}  默認貪心:返回最大匹配
# 6.2(){}? 非貪心

# 7 .search() 返回第一次匹配的文本 .findall()返回匹配的所有文本列表
print('7 .search() 返回第一次匹配的文本 .findall()返回匹配的所有文本列表',end='\n\n')
regulation = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
mod1=regulation.search('cell:451-555-9999 Work: 456-879-8888')
print(".search()".ljust(10,'.')+mod1.group())
print(".findall(),沒有group(),直接輸出")
print(regulation.findall('cell:451-555-9999 Work: 456-879-8888'))

# 若rule中有分組:則findall() 返回元組
print('若rule中有分組:則findall() 返回元組',end='\n\n')
regulation2 = re.compile(r'(\d\d\d)-(\d\d\d)-(\d\d\d\d)')
print(regulation2.findall('cell:451-555-9999 Work: 456-879-8888'))

# 8. ^$:  ^必須要以Hello開頭  , $必須要以Hello結尾
print('8. ^$:  ^必須要以Hello開頭  , $必須要以Hello結尾',end='\n\n')
rule1=re.compile(r'^Hello')
mo1=rule1.search('Hello to me')
print(mo1.group())

# 9.  .通配符,除了換行之外任意字符
print('9. . 通配符,除了換行之外任意字符',end='\n\n')
rule1=re.compile(r'.at')
print(rule1.findall('The cat in the hat sat on the flat mat.'))

# 10. .*匹配除換行符以外的所有字符 默認貪心<>>  .*? 非貪心 <> 
print('10. .*匹配所有字符',end='\n\n')
rule1=re.compile(r'First Name:(.*) Last Name:(.*)')
mo=rule1.search('First Name:Alll Last Name:Wsergart')
print(mo.group(1))8799797
print(mo.group(2))

# 匹配 re.DOTALL 包括換行符的匹配; re.I,re.IGNORECASE 忽略大小寫

'''匹配方法
.search()
.findall()
.sub()

'''

# .search()第一次匹配到的;.findall()返回所有的字符串列表(元組group).sub()取代
print('8. .search()第一次匹配到的;.findall()返回所有的字符串列表(元組group).sub()取代',end='\n\n')
rule=re.compile(r'Agent \w+')
rule.sub('REPLACESEQ','Agent Alice gave the secret documents to Agent Bob.')
print(r"8.2 用字符串本身替換 .sub(r'\1(^_^)~")
rule=re.compile(r'Agent (\w)\w*')
rule.sub(r'\1(^v^)__~','Agent Alice gave the secret documents to Agent Bob.')

'''compile 第二參數:
.*匹配所有字符包括換行 : re.DOTALL
忽略大小寫 : re.I  ||  re.IGNORECASE
忽略空白符和註解: re.VERVOSE
'''
# 11. 複雜的regix
phoneRegix=re.compile(r''' (
                        (\d{3]|
                        ''')

參考:

正則表達式語法
Python書

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章