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书

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