共计 1530 个字符,预计需要花费 4 分钟才能阅读完成。
元字符匹配
单字符匹配:
字符 | 功能 |
---|---|
. | 匹配任意字符,除了 \n |
[] | 匹配 [] 中列举的字符 |
\d | 匹配数字,相当于[0-9] |
\D | 匹配非数字 |
\s | 匹配空白,即空格、tab 键 |
\S | 匹配非空白 |
\w | 匹配单词字符,即任意字母数字下划线 |
\W | 匹配非单词字符 |
数量匹配:
字符 | 功能 |
---|---|
* | 0 或多个,相当于{0,} |
+ | 至少一个,相当于{1,} |
? | 0 或 1 个,相当于{0,1} |
{m} | 匹配前一个规则的字符出现 m 次 |
边界匹配:
字符 | 功能 |
---|---|
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
\b | 匹配单词边界 |
\B | 匹配非单词边界 |
分组匹配:
字符 | 功能 | |
---|---|---|
` | ` | 匹配左右任意一个表达式 |
() | 将括号中字符作为一个分组 |
findall()
匹配字符串中所有符合正则的内容(都没找到返回空列表[])。
import re
s = '我的号码是:10086,你的号码是 10010'
list = re.findall(r'\d+', s, re.S)
print(list) # ['10086', '10010']
字符串的 r 标记,表示当前字符串是原始字符串,即内部的转义字符无效而是普通字符。
re.S 的作用是让 findall()函数在查找时可以自动考虑换行的影响,使得非贪婪匹配可以匹配换行。
re 模块中的标志还有:
- re.IGNORECASE,忽略大小写
- re.MULTILINE,多行匹配
- re.DOTALL,作用类似 re.S
# 通过正则表达式获取图片名称 title 和图片网址 src,res 为网页源代码
p_title = '<img width="100" alt="(.*?)"'
title = re.findall(p_title, res)
p_img = '<img width="100" alt=".*?" src="(.*?)"'
src= re.findall(p_img, res)
非贪婪匹配:“(.?)”用于提取文本 A 与文本 B 之间的内容;“.?”用于代替文本 A 和文本 B 之间的内容。
finditer()
匹配字符串中所有符合正则的内容,返回的结果是迭代器。
iter = re.finditer('d+', s)
for i in iter:
print(i.group())
输出结果如下:
10086
10010
search()
找到一个结果就返回(都没找到返回 None),返回结果是 match 对象。
s = " 我的号码是:10086,你的号码是 10010"
search = re.search("\\d+", s)
print(search.span()) # (6, 11)
print(search.group()) # 10086
match()
从头开始匹配。
s = '我的号码是:10086,你的号码是 10010'
m = re.match('\\d+', s) # 匹配不到
s2 = "10086,10010"
m2 = re.match("\\d+", s2)
print(m2.span()) # (0, 5)
print(m2.group()) # 10086
sub()
sub()函数的名称来自英文单词 substitute(替换),语法格式:re.sub(需要替换的内容, 替换值, 原字符串)
。
预加载正则表达式
s = '我的号码是:10086,你的号码是 10010'
obj = re.compile('d+')
ret = obj.finditer(s)
for i in ret:
print(i.group())
s = "<div class='first'><span id='2'> 周杰伦 </span></div>"
# (?P< 分组名字 > 正则)可以单独从正则匹配的内容中进一步提取内容
obj = re.compile("<span id='d+'>(?P<name>.*?)</span>", re.S)
result = obj.finditer(s)
for i in result:
print(i.group("name")) # 结果为:周杰伦
正文完