Python3爬虫常见的正则匹配规则
正则表达式是在爬虫中比较常见且效率较好,提取信息较快的一种信息提取手段,是处理字符串的强大工具,所以学习正则表达式对于网络爬虫来说无疑是一把利器!
推荐一个正则表达式在线生成的网页:
https://www.sojson.com/regex/可以检测一下自己写的正则表达式是否正确!
-
一些常见的匹配规则:
\w | 匹配数字字母下划线 | \s | 匹配任意空白字符,等价于 [\t\n\r\f] |
\W | 匹配非数字字母下划线 | \S | 匹配任意非空字符 |
\d | 匹配任意数字,等价于 [0-9] | . | 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符 |
\D | 匹配任意非数字 | * | 匹配0个或多个的表达式 |
[...] | 用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k' | + | 匹配1个或多个的表达式 |
[^...] | 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符 | ? | 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式 |
() | 匹配括号内的表达式,也表示一个组 | {n,m} | 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式 |
\A | 匹配字符串开始 | ^ | 匹配字符串的开头 |
\z | 匹配字符串结束 | /Z | 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串 |
\t | 匹配一个制表符 | /n | 匹配一个换行符 |
-
python3的re库的一些常用方法
一、match():re.match(pattern, string, flags=0)
该方法尝试从字符串的起始位置匹配正则表达式,如果匹配返回匹配成功的结果,否则返回none。使用时要注意考虑开头的内容,适用于检测某个字符串是否符合某个正则表达式的规则。示例如下:
import re
content="Hello 123 4567 World_This is a Demo"
result=re.match('^Hello\s\d\d\d\d\s\d{4}\s\w{10}',content)
print(result)
print(result.group())
结果截图:
tip:\s匹配空格,\d匹配数字,\d{4}表示匹配四次规则,\w匹配字母以及下划线,group()方法可以输出匹配到的结果
上面介绍的匹配规则比较麻烦,介绍一下万能匹配:“ .*? ”,这个可以匹配任意字符,只要定义好匹配区间,其中" . "表示 可以匹配任意字符,“ * ” 表示匹配前面的字符无限次,“?”表示匹配非贪婪匹配,可以有效防止匹配到不需要的字符串内容
二、search():re.search(pattern, string, flags=0)
使用这个规则匹配时会扫描整个字符串,然后返回第一个成功匹配的结果、示例如下:
import re
line = "Cats are smarter than dogs";
searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)
if searchObj:
print ("searchObj.group() : ", searchObj.group())
print ("searchObj.group(1) : ", searchObj.group(1))
print ("searchObj.group(2) : ", searchObj.group(2))
else:
print ("Nothing found!!")
结果截图:
三、findall():findall(string[, pos[, endpos]])
该方法会搜索整个字符串,然后返回匹配正则表达式的所有内容。findall() 返回的是一个list对象,示例如下:
import re
pattern = re.compile(r'\d+') # 查找数字
result1 = pattern.findall('runoob 123 google 456')
result2 = pattern.findall('run88oob123google456', 0, 10)
print(result1)
print(result2)
结果截图:
四、compile():re.compile(pattern[, flags])
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象。示例如下:
>>>import re
>>> pattern = re.compile(r'([a-z]+) ([a-z]+)', re.I) # re.I 表示忽略大小写
>>> m = pattern.match('Hello World Wide Web')
>>> print m # 匹配成功,返回一个 Match 对象
<_sre.SRE_Match object at 0x10bea83e8>
>>> m.group(0) # 返回匹配成功的整个子串
'Hello World'
>>> m.span(0) # 返回匹配成功的整个子串的索引
(0, 11)
>>> m.group(1) # 返回第一个分组匹配成功的子串
'Hello'
>>> m.span(1) # 返回第一个分组匹配成功的子串的索引
(0, 5)
>>> m.group(2) # 返回第二个分组匹配成功的子串
'World'
>>> m.span(2) # 返回第二个分组匹配成功的子串
(6, 11)
>>> m.groups() # 等价于 (m.group(1), m.group(2), ...)
('Hello', 'World')
-
re库常见修饰符:
修饰符被指定为一个可选的标志,用于控制匹配的模式。
re.I | 使匹配对大小写不敏感 |
re.L | 做本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响 ^ 和 $ |
re.S | 使 . 匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 |