1.正则表达式简介
正则表达式用于搜索、替换和解析字符串。Python提供了re模块进行正则表达式的验证。
正则表达式由字母、数字和特殊字符(括号、星号、问好等)组成
特殊字符含义:
^
开始字符$
结束字符.
匹配任意字符(包括汉字)[m]
匹配单个字符串[m1m2 ... n]
匹配多个字符串[m-n]
匹配m到n之间的数字、字母[^m]
匹配除m以外的字符串( )
对表达式进行分组\w
匹配字母、数字、下划线\W
匹配非字母、数字、下划线\s
匹配空白字符\S
匹配非空白字符\d
匹配数字\D
匹配非数字\b
匹配单子的开始和结束\B
匹配非单词开始和结束
常用限定符:
*
匹配0次或更多次+
匹配1次或更多次?
匹配0或1次{m}
重复m次{m, n}
重复m到n次。n可省略,表示m到任意次。
匹配电话号码:
\d{3} - \d{8} | \d{4} - \d{7} #如:010 - 12345678
考虑更多情况:
[\(-]? \d{3} [\)-]? \d{8} | [\(-]? \d{4} [\)-]? \d{7} #如:01012345678、(010)12345678等
注意,(
和)
是特殊字符,需要转义才能输出;-
不是特殊字符,无需转义
2.使用 sys.re 模块处理正则表达式
常用函数:
- findall(pattern, string, flags)
查找全部匹配项
- sub(pattern, repl, string, count)
替换
- subn(pattern, repl, string, count)
同上
- match(pattern, string, flags)
只返回第一次匹配成功的对象。必须从第0个索引位开始匹配,否则匹配失败。
- search(pattern, string, flags)
只返回第一次匹配成功的对象
- compile(pattern, string, flags)
编译正则表达式,返回Pattern对象
- split(pattern, string, maxsplit)
分隔字符串
- escape(pattern)
匹配特殊字符,如*
、+
、?
等
常用flags:
- I(或IGNORECASE) 忽略大小写
- L(或LOCALE) 字符集本地化
- M(或MULTILINE) 多行匹配
- S(或DOTALL) 使”.”匹配包括”\n”在内的所有字符
- X(或VERBOSE) 忽略表达式中的空白换行等等,方便添加注释
- U(或UNICODE)
实例:
import re
s = "HELLO WORLD"
print(re.findall(r"^hello", s))
print(re.findall(r"^hello", s, re.I)) #忽略大小写
print(re.findall(r" \b \w + \b", s)) #匹配单词
正则表达式解析非常费时 ,如果多次使用findall()的方式匹配 字符串,搜索效率可能很低下。可以使用compile()函数进行预编译,返回一个pattern对象。该对象拥有一系列的方法用于查找、替换、扩展字符串,从而提高匹配速度。
import re
s = "1asdf23hg45"
p = re.compile(r"\d +") #匹配数字
print(p.findall(s))
match()和search()函数:
正则表达式从左往右计数,第一个出现的圆括号为第1组,以此类推。此外0号组用于匹配整个正则表达式的结果。match()和search()函数返回一个match对象,这个对象提供了一系列的方法和属性用来管理匹配的结果:
- group(index) 某个分组的匹配结果。如index=0, 则匹配整个字符串
- groups() 所有分组的匹配结果
- groupdict() 返回key为组名,value为每个分组匹配结果的字典
- re 正则表达式对象
- string 搜索的字符串
示例如下:
import re
p = re.compile(r"(abc) \1")
m = p.match("abcabcabc")
print(m.group(0))
print(m.group(1))
print(m.group())
p = re.compile(r"(? P<one> abc) (? P=one)") # ? P<one> 中的 one 表示分组名称,(? P=one) 调用分组 one ,相当于 \1
m = p.search("abcabcabc")
print(m.group("one"))
print(m.groupdict().keys())
print(m.groupdict().values())
print(m.re.pattern)