模块 re
基本使用
\d = [0-9] digit 整数
\w = [0-9a-zA-Z_] 还可以包括下划线
\s = [\t\r\n\v\f] 空格 制表符 回车符 换行符
\D \W \S 分别与 \d \w \s相反
. 可以匹配任意字符(除了换行符)
数量词
\d{6} 出现6次数字
\d{4,6} 数字出现4-6次
\d{4,} 数字出现4-65536次
\d{0,6} 数字出现0-6次
特别的
*={0,}
+={1,}
?={0,1}
数量词默认用法是贪婪,如果在数量词后面加’?’,进行非贪婪
意思是 如果 r'\d[3,5]?' 有 3个就3个
定界符
^ 从开始位置匹配
$ 从结束位置匹配
以上两个均为 整个字符串中 各行的 起始/结束
\A 整个字符串的起始位置
\Z 整个字符串的结束位置
re.match() 和 re.search()
re.match(pattern,string,flags) # 从字符串起始位置开始
若 找到 则 返回 Match对象
否则 返回 None
re.search(pattern,string,flags) # 没有限制
若 找到 则 返回 Match对象
否则 返回 None
Match对象的成员函数 group() 用以显示匹配到内容
re.findall(pattern,string,flags) 以列表的形式返回符合条件的所有元素
re.sub()字符串替换
re.sub(pattern,replacement,string)
括号的作用
(1) 分组
如 (ab)+ 和 ab+ (不加括号就是要求b出现一次以上)
(2)多选结构
(\d{3}|[a-z]{3})
(3)引用分组
<1> 引用分组
print(re.search('(\d{3})a(\w)','a123abc').group())
print(re.search('(\d{3})a(\w)','a123abc').group(1))
print(re.search('(\d{3})a(\w)','a123abc').group(2))
输出为 123ab
123
b
就是其分隔的作用
<2>反向引用
反向引用(backreference)
根据揭开《正则表达式的神秘面纱》一文,发现原来正则除了贪婪和非贪婪外还有名为“反向引用”的高级规则。
表达式在匹配时,表达式引擎会将小括号 “( )” 包含的表达式所匹配到的字符串记录下来。在获取匹配结果的时候,小括号包含的表达式所匹配到的字符串可以单独获取。
“\1” 引用第1对括号内匹配到的字符串,”\2” 引用第2对括号内匹配到的字符串……以此类推。
如果一对括号内包含另一对括号,则外层的括号先排序号。换句话说,哪一对的左括号 “(“ 在前,那这一对为先。
在正则(.+)\1中,\1等于(.+)中匹配到的值,也就是连续2次相同的值。
简言之,就是匹配重复的内容
<3>命名分组
print(re.search(r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})','2000-01-02').group())
print(re.search(r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})','2000-01-02').group('year'))
print(re.search(r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})','2000-01-02').group('month'))
print(re.search(r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})','2000-01-02').group('day'))
<4>非捕获分组
print(re.search('(?:\d{3})a(\w)','a123abc').group())
print(re.search('(?:\d{3})a(\w)','a123abc').group(1))
输出:
123ab
b
不计算组数
转义
\ 就是转义符
断言
单词边界
略
环视
略
匹配模式
1.不区分大小写
(?i)the
2.单行模式
(?s) 这种模式下.也可以匹配\n
3.多行模式
(?m)
4.注释模式
(?x)
面向对象式
略
(持续更新中)