菜鸟博客
菜鸟站长

【Python爬虫学习笔记】常用的正则匹配规则

模  式 描  述
\w 匹配字母、数字及下划线
\W 匹配不是字母、数字及下划线的字符
\s 匹配任意空白字符,等价于 [\t\n\r\f]
\S 匹配任意非空字符
\d 匹配任意数字,等价于 [0~9]
\D 匹配任意非数字的字符
\A 匹配字符串开头
\Z 匹配字符串结尾,如果存在换行,只匹配到换行前的结束字符串
\z 匹配字符串结尾,如果存在换行,同时还会匹配换行符
\G 匹配最后匹配完成的位置
\n 匹配一个换行符
\t 匹配一个制表符
^ 匹配一行字符串的开头
$ 匹配一行字符串的结尾
. 匹配任意字符,除了换行符,当 re.DOTALL 标记被指定时,则可以匹配包括换行符的任意字符
[…] 用来表示一组字符,单独列出,比如 [amk] 匹配 a、m 或 k
[^…] 不在 [] 中的字符,比如  匹配除了 a、b、c 之外的字符
* 匹配 0 个或多个表达式
+ 匹配 1 个或多个表达式
? 匹配 0 个或 1 个前面的正则表达式定义的片段,非贪婪方式
{n} 精确匹配 n 个前面的表达式
{n, m} 匹配 n 到 m 次由前面正则表达式定义的片段,贪婪方式
a|b 匹配 a 或 b
() 匹配括号内的表达式,也表示一个组

常用的匹配方法 —— match

import re

content = 'Hello 123 4567 World_This is a Regex Demo'
print(len(content))
result = re.match('^Hello\s\d\d\d\s\d{4}\s\w{10}', content)
print(result)
print(result.group())
print(result.span())

调用 group 方法

import re

content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^Hello\s(\d+)\sWorld', content)
print(result)
#输出完整的匹配结果
print(result.group())
#输出第一个被 () 包围的匹配结果
print(result.group(1))
print(result.span())

.* 用法,贪婪匹配和非贪婪匹配

import re

content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^He.*(\d+).*Demo$', content)
print(result)
#  .* 用法 . 可以匹配任意字符(除换行符),* 代表匹配前面的字符无限次
#贪婪匹配下,.* 会匹配尽可能多的字符,只给 \d+ 留下一个可满足条件的数字 7
result = re.match('^Hello.*Demo$', content)
#非贪婪匹配下,.* 会尽可能匹配少的字符,给 \d+ 留下1234567
result = re.match('^He.*?(\d+).*Demo$', content)
print(result.span())

#注意:在结尾加上.*? 就有可能匹配不到任何内容了,因为它会匹配尽可能少的字符
content = 'http://weibo.com/comment/kEraCN'
result1 = re.match('http.*?comment/(.*?)', content)
result2 = re.match('http.*?comment/(.*)', content)
print('result1', result1.group(1))
print('result2', result2.group(1))

修饰符

import re

content = '''Hello 1234567 World_This
is a Regex Demo
'''
#遇到换行符时,.*? 就不能匹配了,需要加上修饰符 re.S
result = re.match('^He.*?(\d+).*?Demo$', content, re.S)
print(result.group(1))

常用修饰符

修饰符 描  述
re.I 使匹配对大小写不敏感
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^ 和 $
re.S 使匹配包括换行在内的所有字符
re.U 根据 Unicode 字符集解析字符。这个标志影响 \w、\W、\b 和 \B
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解

较为常用的修饰符有 re.S 和 re.I

转义匹配

import re

content = '(百度) www.baidu.com'
#遇到用于正则匹配模式的特殊字符时,在前面加反斜线转义。例 . 就可以用 \. 来匹配
result = re.match('\(百度 \) www\.baidu\.com', content)
print(result)

search 匹配方法

# match 方法在使用时需要考虑到开头的内容,更适合用来检测某个字符串是否符合某个正则表达式的规则
#search方法在匹配时会扫描整个字符串,直到找到第一个符合规则的字符串,然后返回匹配内容

findall 匹配方法

import re

#返回匹配到的所有内容
results = re.findall('<li.*?href="(.*?)".*?singer="(.*?)">(.*?)</a>', html, re.S)
print(results)
print(type(results))
for result in results:
    print(result)
    print(result[0], result[1], result[2])

sub 方法(替换内容)

import re

#替换所有的数字
content = '54aK54yr5oiR54ix5L2g'
content = re.sub('\d+', '', content)
print(content)

compile 方法,将正则字符串编译成正则表达式对象,以便复用

import re

content1 = '2019-12-15 12:00'
content2 = '2019-12-17 12:55'
content3 = '2019-12-22 13:21'
pattern = re.compile('\d{2}:\d{2}')
result1 = re.sub(pattern, '', content1)
result2 = re.sub(pattern, '', content2)
result3 = re.sub(pattern, '', content3)
print(result1, result2, result3)
赞(0)
未经允许不得转载:不吃香菜 » 【Python爬虫学习笔记】常用的正则匹配规则

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址