Python正则表达式模块re
元字符匹配
单字符匹配:
字符 | 功能 |
---|---|
. | 匹配任意字符,除了\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")) # 结果为:周杰伦
当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »