Python3网络爬虫(四) --正则表达式

正则表达式是处理字符串的强大工具,可以实现字符串的检索,替换,匹配等等,首先我们可以使用一个正则测试工具:http://tool.oschina.net/regex/

符号说明
\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 次由前面的正则表达式定义的片段,贪婪方式
( )匹配括号内的表达式,也表示一个组

re库

在Python中写正则表达式基本上都是用这个库

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)
# 这里相当于hello后面匹配一个空格,三个数字,一个空格,四个数字,10个字母数字及下划线
print(result)  # 这是一个对象
print(result.group())  # 返回匹配的结果
print(result.span())  # 返回匹配的范围

如果要从字符串中提取一部分内容,可以使用:

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))  # group(1) 会输出第一个被 () 包围的匹配结果
print(result.span())

通用匹配:!!!经常用到
万能匹配,也就是 .* (点星),代表匹配任意字符

import re
content = 'Hello 123 4567 World_This is a Regex Demo'
result = re.match('^Hello.*Demo$', content)
#  这里匹配出以hello开头demo结尾的字符串

贪婪和非贪婪:

import re
content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^He.*(\d+).*Demo$', content)
# 目标是获取中间的数字
print(result)
print(result.group(1))  # 得到的是7

原理:贪婪匹配模式下,点星会匹配尽可能多的字符,\d+表示至少一个数字,所以点星就尽可能多匹配,留给\d+一个7,所以Group(1)返回一个7。我们可以使用非贪婪匹配.*?就可以得到中间的数字,非贪婪模式就是尽可能匹配到少的字符,所以我们在字符串中间尽量使用非贪婪匹配

修饰符:
result = re.match('^He.*?(\d+).*?Demo$', content, re.S)
这第三个参数的含义是匹配包括换行符在内的所有字符。
网页匹配中最长用到,re.I和re.S,re.I表示对匹配大小写不敏感。

特殊字符前面加反斜杠就可以转义

=============================================================

search():
match()只能从字符串的开头开始匹配,所以很不方便。
有另外一个方法 search(),它在匹配时会扫描整个字符串,然后返回第一个成功匹配的结果,所以我们尽量使用search()

=============================================================

findall():
search是找到第一个结果,但是如果想找到所有的结果,就使用findall:

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():
需要用正则的方式修改文本可以使用sub()

import re
content = '54aK54yr5oiR54ix5L2g'
content = re.sub('\d+', '', content)
print(content)

有时候我们可以用这种方法将不需要的信息全部删减掉,然后再提取我们需要的信息

=============================================================

compile():
这个方法可以将正则字符串编译成正则对象,以便后面复用:

import re
content1 = '2016-12-15 12:00'
content2 = '2016-12-17 12:55'
content3 = '2016-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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值