正则表达式: 字符串处理工具
应用场景
re 模块
match方法
# 通过正则表达式对字符串进行匹配 import re # 使用match方法进行匹配操作 # re.match() 从字符串的开始位置进行匹配, # 匹配成功,返回match对象。 # 匹配失败,返回None # res = re.match(正则表达式,要匹配的字符串) # 匹配到数据,使用group方法提取数据 # print(res.group()) # 例子,判断字符串是否满足正则表达式。 只会从开头进行匹配 name = re.match("卡","卡夫卡") print(name) #打印match对象 print(name.group()) #打印匹配到的数据 name = re.match("卡","夫卡") print(name) # None name = re.match("fire","firefox") print(name.group()) #返回fire
字符 | 功能 |
---|---|
. | 匹配任意1个字符(\n除外) |
[ ] | 匹配[ ]中列举的字符 |
\d | 匹配数字0,1,2,3,4,5,6,7,8,9 |
\D | 匹配非数字,即不是数字 |
\s | 匹配空白,即 空格 和 tab键 |
\S | 匹配非空白 |
\w | 匹配单词字符,即a-z,A-Z,0-9,_,汉字 |
\W | 匹配非单词字符 |
res = re.match(".","年轻人不讲武德") print(res.group()) # 匹配第一个字符 # 年 res = re.match("..","年轻人不讲武德") print(res.group()) # 匹配前两个字符 # 年轻 # [] 匹配 [ ]中列举的字符 res = re.match('[网东]','网上的东西都是虚拟的') print(res.group()) # 网 # 匹配数字 res = re.match('\d','你好啊,123456') res = re.match('[0-9]','你好啊,123456') res = re.match('[0-46-9]','你好啊,123456') #不匹配数字5 res = re.match('[a-zA-Z]','Hello') #匹配所有的大小写字母 # 匹配数字0,1,2,3,4,5,6,7,8,9 res = re.match('\d','123456') # 匹配非数字 res = re.match('\D','105°的蒸馏水') # 匹配空白 res = res.match("\s","匹配空白 的字符串") # 匹配非空白 res = res.match("\S","匹配空白 的字符串") # 匹配单词字符 res = res.match("\w","匹配空白 的字符串") # 匹配非单词字符 res = res.match("\W","匹配空白 的字符串")
字符 | 功能 |
---|---|
* | 出现0次到无限次 |
+ | 出现1次到无限次 |
? | 出现0次或者出现1次 |
{m} | 出现m次 |
{m,n} | 出现m次到n次 |
# 匹配多个字符 # 1 * 匹配前一个字符出现0次或者无限次 import re res = re.match("\w","小白") print(res.group()) res = re.match("\w*","小白") #\w出现0次到无限次 print(res.group()) res = re.match("\d*","小王") print(res.group()) res = re.match("\d+","哈哈哈123") print(res.group()) res = re.match("\s?","123456") print(res.group()) # {m}匹配前一个字符出现m次 res = re.match("\w{6}","qwerty123") #出现6次 print(res.group()) res = re.match("\w{6,12}","qwerty123") #最少是6位,最多是12位 print(res.group())
字符 | 功能 |
---|---|
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
# 1. ^ 匹配字符串开头 # ^ 表示以什么开头、表示对什么取反 import re res = re.match("^ab","abcd") #表示以ab开头 # 注意 ^在[]中才表示不匹配 res = re.match('[^ab]','abcd') # 表示匹配不是ab的字符 print(res.group()) # [abc] 表示满足abc中的一个 # ^[abc] 开头满足abc中的一个 # [^abc] 匹配除了abc之外的字符 res = re.match(".*e$","hello") #以e结尾 print(res.group())
字符 | 功能 |
---|---|
| | 匹配左右任意一个表达式 |
(ab|cd) | 将括号中字符作为一个分组 |
\num | 引用分组num匹配到的字符串 |
(?P) | 分组起别名 |
(?P=name) | 引用别名为name分组匹配到的字符串 |
import re # | 匹配左右任意一个表达式 res = re.match("\d","10") print(res.group()) # 满足\d 和 100 中任意一个即可 res = re.match("\d|100","100") print(res.group()) res = re.match("\w*","hello@163.com") print(res.group()) # 满足 qq 、163 、 129 满足任意一个即可 res = re.match("\w@(qq|163|129).com","hello@163.com") print(res.group()) # (\w*) 是一个分组 , \1则引用第一个分组,即(\w*) # 所以<(\w*)>\w*</\1> 等价于 <(\w*)>\w*</(\w*)> res = re.match(r"<(\w*)>\w*</\1>","<html>python</html>") # <(\w*)>(\d*)</\2> 等价于 <(\w*)>(\d*)</(\d*)> # res = re.match(r"<(\w*)>(\d*)</\2>","<html>python</html>") # (?P<name>) # 给(\w*) 起别名n1 , 通过?P=n1 引用标签n1 res = re.match(r"<(?P<n1>\w*)>\w*</?P=n1>","<html>python</html>")
举例 匹配.com 或 .cn后缀的网址
li = ["www.baidu.com","www.123.com","www.taobao.com","www.en.n"] for each in li: res = re.match('.*(.com|.cn)',each) print(res.group())
# search 函数 和 match函数有点类似 # match 函数: 从开始位置匹配 # search 函数:扫描全部,找到第一个匹配成功的数据 res1 = re.match("ab","12abwe") res2 = re.search("ab","12abwe") print(res1.group()) print(res2.group()) # findall() 以列表形式返回匹配到的字符串 # 从头到尾匹配,找到所有匹配成功的数据,返回一个列表 res = re.findall('ab','12abweabty') print(res)
# sub() 将匹配到的数据进行替换 # sub(正则表达式,新内容,字符串,指定替换的次数) res = re.sub("5","800","今天打了5把斗地主") #把5替换为800 print(res) res = re.sub("\d","800","今天打了5把斗地主") #所有的数字都换成800 print(res) res = re.sub("\d","800","今3天打了5把斗4地主",2) #只把前2个数字替换为800 print(res) # split(正则表达式,字符串,指定的最大分割次数) res = re.split(';','a b;c 12') #按照;进行分割 print(res) res = re.split("\d",'das1sda2w6sq') #按照数字进行分割 print(res) res = re.split("\d",'das1sda2w6sq',2) #只切割前2个
贪婪匹配: 在满足匹配时,匹配尽可能长的字符串,默认情况下,采用贪婪模式
非贪婪模式:在满足匹配时,匹配尽可能短的字符串,使用**?**来表示非贪婪匹配
# 贪婪匹配 res = re.match("ab*","abbbbb") print(res.group()) # 输出结果 # abbbbb # 非贪婪匹配 # 在 * , + , {m,n} 等后面加上? ,表示使贪婪变成非贪婪 res = re.match("ab*?","abbbbb") #非贪婪匹配 print(res.group()) # 输出结果 # a res = re.match("ab+?","abbbbb") print(res.group()) # 输出结果 # ab res = re.match("t{2,4}?","tttttt") #非贪婪匹配 print(res.group()) # 输出结果 # tt
在字符串前加上r表示原生字符串
# 正则表达式中,需要匹配\那么需要用到 \\\\ 进行匹配 res = re.match('\\\\de','\def') res = re.match(r"\\de",'\def') res = re.match(r"c:\\","c:\a\b")