目录
1. 基本知识
2.常用元字符
3. 量词
4.贪婪匹配和惰性匹配
5. findall、finditer、search、match、compile 用法
6. 给分组起别名
1. 基本知识
正则表达式(Regular Expression)是一种使用表达式对字符串进行匹配的语法规则,用于处理字符串 。
优点:速度快、效率高、准确性高
语法规则:使用元字符排列组合用来匹配字符串。
- 元字符:具有固定含义的特殊符号
- 量词: 控制前面的元字符出现的次数
2.常用元字符
常用的元字符
元字符 | 含义 |
---|
. | 匹配除换行符(\n、\r)之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用像"(.|\n)"的模式。 | \w | 匹配字母或数字或下划线 | \s | 匹配任意的空白字符 | \d | 匹配数字 | \n | 匹配一个换行符 | \t | 匹配一个制表符 | ^ | 匹配字符串的开始 | $ | 匹配字符串的技术 | \W | 匹配非字母或数字或下划线 | \D | 匹配非数字 | \S | 匹配非空白符 | a|b | 匹配字符a或字符b | () | 匹配括号内的表达式,也表示一个组 | [...] | 匹配字符组中的字符 | [^...] | 匹配除了字符组中字符的所有字符 |
3. 量词
作用:控制前面的元字符出现的次数
量词
元字符 | 含义 |
---|
* | 重复零次或更多次,? 等价于{0, } | + | 重复一次或更多次,等价于{1,} | ? | 重复零次或一次 | {n} | 重复n次 | {n,} | 重复n次或更多次 | {n, m} | 重复n到m次 |
4.贪婪匹配和惰性匹配
表达式 | 含义 |
---|
.* | 贪婪匹配(尽可能多的去匹配) | .*? | 惰性匹配(尽可能少的去匹配) |
示例
str: "玩吃鸡游戏,晚上一起上游戏,干嘛呢, 打游戏啊"
reg: 玩.*?游戏
此时匹配的是: 玩吃鸡游戏
reg: 玩.*游戏
此时匹配的是: 吃鸡游戏,晚上一起上游戏,干嘛呢, 打游戏
5. findall、finditer、search、match、compile 用法
补充: 正则表达式式中使用括号就分组匹配,一个括号就是一个分组。
(1) findall和finditer :都可以获取所有匹配的结果,不同时是findall返回的是一个list,而finditer 返回的是一个迭代器<class 'callable_iterator'>
str1 = "我今年25岁, 我有2000万"
res = re.findall("\d+", str1)
print(res) # ['25', '2000']
res = re.finditer("\d+", str1)
print(type(res))
for item in res: # 从迭代器中拿到内容
print(item.group()) # 从匹配的结果中拿到数据
# 25
# 2000
(2)search和match
? ? a. search:会扫描整个字符串匹配,只会返回第一次匹配到的内容,返回的是Match object ,需要使用group拿到数据
# search用法
res = re.search("\d+", str1)
print(res) # <re.Match object; span=(3, 5), match='25'>
print(res.group()) # 25
? ? b.match在匹配的时候,是从字符串的开头进行匹配,类似在正则前面加上^。只有在0位置匹配成功才有返回,否则返回None
res = re.match(r"\d+", str1)
print(res)
(3)compile?预加载,提前把正则对象加载完毕
s = """
<div class='西游记'><span id='10086'>中国移动</span></div>
<div class='西游记'><span id='10010'>中国联通</span></div>
"""
obj = re.compile(r"<span id='(\d+)'>(.*?)</span>")
# 直接把加载好的对象进行使用
res = obj.findall(s)
print(res)
# [('10086', '中国移动'), ('10010', '中国联通')]
6. 给分组起别名
语法: (?P<名称>正则)
s = """
<div class='西游记'><span id='10086'>中国移动</span></div>
<div class='西游记'><span id='10010'>中国联通</span></div>
"""
obj = re.compile(r"<span id='(?P<id>\d+)'>(?P<name>.*?)</span>")
res = obj.finditer(s)
for item in res:
print(item.group("id"), item.group("name"))
# 10086 中国移动
# 10010 中国联通
|