修饰符分类
\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]|
''')
参考: