正则表达式(python)
一. 用途
简单来说,正则表达式是用来对字符串做处理的。它定义了字符串的一个“模型”,符合这个模型的字符串将被匹配/筛选
二. 举例
直接上语法规则比较枯燥,先用一个例子来体会一下:
匹配的字符串:“hello world”
正则表达式:“h…llo"
("."表示任意除换行符以外的字符)
匹配结果:“hello”
三. 语法规则
完整介绍:
(图片来源:CSDN)
残缺版重点:
完整版太长了,总结一下,一般情况常用的几个:
字符类
语法 | 解释 | 模式 | 字符串 |
---|---|---|---|
. | 匹配除换行符“\n“以外的字符 | Hell… .orld | Hello! World |
[…] | 字符集,相当于一个列表集合,可以代替集合中的任意元素 | xi[xia]xi | xixxi/xiixi |
\d | 数字 | 6\d6 | 666 |
\w | 单词 | Str\wng | Strong |
数量类
语法 | 解释 | 模式 | 字符串 |
---|---|---|---|
* | [0,) | 23* | 23333 |
{m,n} | [m , n]一般模式 | 23{2,4} | 233333/2333/23333 |
定位符类
语法 | 解释 | 模式 | 字符串 |
---|---|---|---|
^ | 定位首位(多行定位,每一行开头) | ^ho | ho\nho匹配出两个ho |
$ | 定位末尾(多行定位,每一行末尾) | niu$ | niuni无法匹配,因为niu不在末尾 |
分组类
每个正则表达式可以作为一个分组使用‘()’括起来,通过连接词等形式组合在一起,变成更长的正则表达式。
正则表达式允许为该分组命名,并引用之前定义过的分组。
四. python正则表达式使用
python re模块用于处理正则表达式
原生字符串对应python中的pattern
#r代表后面的字符串为正则表达式,用于避免语言和正则表达式之间的反斜杠问题
pattern = re.compile(r'hello')
拥有pattern后,python将其传入re模块,对正则表达式模式进行处理
re模块提供一下几种方法:
re.match(pattern, string[, flags]) #match是检测传入的string是否符合这个模式,且是从头开始匹配
re.search(pattern, string[, flags])#search是搜索string中符合模式的部分,调用group()返回匹配的列表
re.split(pattern, string[, maxsplit])#模式作为分割符将string进行分割,返回分割后的列表
re.findall(pattern, string[, flags])#搜索string,以列表形式返回全部能匹配的子串
re.finditer(pattern, string[, flags])#搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器
re.sub(pattern, repl, string[, count])#替换匹配到的所有子串为指定内容,并返回整个字符串
re.subn(pattern, repl, string[, count])
常用举例:
Search:
result = re.search(r"\d+", "送你999朵花") # match默认从开头匹配,search不要求从开头匹配,如果正则表达式中加入^表示从开头匹配,那么search与match相同。
if result:
print(result.group()) # 999 自会匹配第一个 (findall匹配所有,返回列表)
else:
print("未找到")
findall
result = re.findall(r"\d+", "送你999多花,老铁双击666") # search只匹配第一个,findall匹配所有(返回列表)
if result:
print(result) # ['999', '666']
else:
print("未找到")
spilt
result = re.split(r":| ","1:李华 12 岁") # 切割,根据冒号:或者空格切割,返回列表
print(result) # ['1', '李华', '12', '岁']
Sub
# sub替换 替换成固定字符串
result = re.sub(r"996", "早9晚9上6天","现在互联网实行996,甚至007") # 替换匹配到的所有,并返回整个字符串。
print(result) # 在互联网实行早9晚9上6天,甚至007