元字符
.点匹配换行符意外的任意字符,re.S 可以让正则中的.匹配换行符\w匹配字母或数字或下划线- \s 匹配任意的空白符
\d匹配数字- \n 匹配一个换行符
- \t 匹配一个制表符
- ^ 匹配字符串的开始
- $ 匹配字符串的结尾
- \W 匹配非字母或数字或下划线
- \D 匹配非数字
- \S 匹配非空白符
- a|b 匹配字符a或者字符b
- () 匹配括号内的表达式,也表示一个组
- [...] 匹配字符组中的字符
- [^...] 匹配除了字符组中字符的所有字符
量词
控制元字符出现的次数
*出现0次或多次+出现一次或多次?出现0次或一次- {n} 出现n次
- {n,} 出现大于等于n次
- {n,m} 出现n到m次
贪婪匹配和惰性匹配
.*贪婪匹配(尽可能远的匹配),re.S可以让正则中的.匹配换行符.*?惰性匹配(尽可能近的匹配,匹配过程是先匹配最远,然后往回缩找最近的匹配,这个过程叫“回溯”),re.S可以让正则中的.匹配换行符
demo
内容
玩儿吃鸡游戏,晚上一起打游戏,干嘛呢?打游戏啊
贪婪匹配
玩儿.*游戏,尽可能远的匹配,结果为:玩儿吃鸡游戏,晚上一起打游戏,干嘛呢?打游戏
惰性匹配
玩儿.*?游戏,尽可能近的匹配,结果为:玩儿吃鸡游戏
re模块
import re
result = re.findall(r'\d+', 'this is 1 and 123')
print(result) # ['1', '123']
result = re.finditer(r'\d+', 'this is 1 and 123') # 重要
for item in result: # 从迭代器中获取内容
print(item.group()) # 从匹配到的结果中拿到数据
# search只会匹配到第一次匹配的内容
result = re.search(r'\d+', 'this is 1 and 23')
print(result.group()) # 1
# 预加载,提前把正则对象加载完毕,提高性能,节省内存
re_compile = re.compile(r'\d+')
search = re_compile.search('this is 123')
print(search.group()) # 123
# 提取分组数据并单独起名,(?P<名字>正则),提取数据使用:item.group('名字')
s = """
<div class='西游记'><span id='10010'>中国联通</span></div>
<div class='西游记'><span id='10086'>中国移动</span></div>
"""
# re.S 可以让正则中的.匹配换行符
obj = re.compile(r"<span id='(?P<id>\d+)'>(?P<name>.*?)</span>", re.S)
result = obj.finditer(s)
for item in result:
print(item.group('id'))
print(item.group('name'))