目录
19 正则表达式
import re
#关于最后一个flag参数,re.
# I 忽略大小写
# M 多行模式
# S 任意字符,'.','\n'
# L 特殊字符集 \w \W \b \B \s \S
# U 特殊字符集,包括上述和 \d \D
# X 忽略空格和'#'后的注释
#特殊字符类:
# . 除"\n"外的任意单个字符
# \w [A-Za-z0-9_]
# \s 空白字符,[\t\n\r\f]
# 大写即非
# \b 字母数字与非字母数字的边界 \B 字母与字母数字
'''match'''
print(re.match('abc','abcde')) # <re.Match object; span=(0, 3), match='abc'>
print(re.match('abc','abcde').span()) # (0, 3)
#若不在起始位置匹配输出None
'''search'''
print(re.search('bcd','abcde').span()) # (1, 4)
#可以不在起始位置匹配
# 一个()是一个group,.*通配,.*?只保留匹配到的第一个
print(re.search(r'(.*)///abc(.*)///(.*?)','h///abc///d///e///f').group(2)) # ///d///e
print(re.search(r'(.*)///abc(.*)(.*?)','h///abc///d///e///f').groups()) # ('h', '///d///e///f', '')
#这方面好像和match没差
'''sub'''
print(re.sub(r'\D','','32CN34',1)) # 32N34
#替换内容可为函数
def f(x):
y=int(x.group('v'))-1
return str(y)
print(re.sub('(?P<v>\d+)',f,'32CN34')) # 31CN33,多个数字
'''compile'''
#生成pattern,代替match和search的第一个参数
p=re.compile(r'[a-z]+',re.I)
print(p.match('dAu338Wd',1,3)) # 可设置起始位置,[,)
'''findall'''
print(p.findall('dAu338Wd,1,7')) # ['dAu', 'Wd'],列表形式
print(re.findall(r'(\w+):(\d+)','sd:54ad:39')) # [('sd', '54'), ('ad', '39')]
'''finditer'''
it=re.finditer(r'a.*?\B','abacadae')
for t in it:
print(t.group(),end=' ') # a a a a <?>
'''split'''
print(re.split('a','abacadae')) # ['', 'b', 'c', 'd', 'e']
print(re.split('(a)','abacadae')) # ['', 'a', 'b', 'a', 'c', 'a', 'd', 'a', 'e']
#正则表达式模式:
# ^ 开头 $ 末尾
# [str] 其中字符,单独列出 [^str] 不在[]中的字符
# re* 0或多个 re+ 1或多个 re? 0或1个(贪婪方式)
# re{n} n个 re{n,} >=n个 re{n,m} 贪婪方式n到m次
# \A 开始 \z 结束 \Z 结束,到换行前
# \G 最后匹配完成的位置
# \1...\9 n个分组的内容 \10 n个分组,若未匹配为八进制字符码表达式