python网络爬虫开发:re模块实现正则表达的操作

2022-08-0711:07:11云计算与物联网Comments1,353 views字数 3139阅读模式

学习Python的内置re模块,re模块用于实现正则表达的操作,它里面提供了很多方法,例如search()、match()、findall()、split()、sub()等,下面我们依次进行学习。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

1. search()方法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

search方法在输入的字符串中查找,返回第一个匹配的内容,在找到之后返回match对象,未找到返回None。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

语法格式如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

1
re.search(pattern,string,[flags])

pattern表示需要匹配的模式,即以正则表达式来转换string字符串,flags为标志位,用于控制匹配方式。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

Flags常用参数如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

1) A文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

对于\w、\b、\d等只进行ASCII匹配文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

2) I文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

匹配的时候不区分大小写文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

3) S文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

使用‘.’字符匹配所有字符文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

4) X文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

忽略字符串中为转移的空格及注释文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

我们通过例题来了解一下,代码如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

1
2
3
4
import re
string = 'this is www.DOTcpp.com'
pattern = r'dotcpp'
print(re.search(pattern,string,re.I))#不区分大小写的方式匹配

输出结果为:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

1
<re.Match object; span=(1218), match='DOTcpp'>

这个例子中我们以不区分大小写的方式在string字符串中搜索‘dotcpp’,输出的信息为它的位置及搜索信息。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

2. match()方法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

match方法从字符串的开始位置查询匹配内容,如果找到则返回一个match对象,未找到返回None。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

语法格式如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

1
re.match(pattern,string,[flags])

具体参数同search相同,可以参看上面的内容。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

如果我们把上面例子中的方法改为match,输出结果为None。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

1
2
3
4
import re
string = 'this is www.DOTcpp.com'
pattern = r'dotcpp'
print(re.match(pattern,string,re.I))#不区分大小写的方式匹配

输出结果:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

1
None

我们对代码进行修改,把正则表达式修改为字符串开始处的内容,代码如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

1
2
3
4
import re
string = 'this is www.DOTcpp.com'
pattern = r'Th'
print(re.match(pattern,string,re.I))#不区分大小写的方式匹配

输出结果为:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

1
<re.Match object; span=(02), match='th'>

一定要注意search用法和match用法的区别,一般推荐大家使用research方法。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

 3. findall()方法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

findall方法会在整个字符串中搜索出符合条件的字符串,然后以列表的形式返回。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

语法格式如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

1
re.findall(pattern,string,[flags])

具体参数一致。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

我们继续修改上面的代码来进行了解,我们把字符串中内容更改一下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

1
2
3
4
import re
string = 'this is www.DOTcpp.com dotcpp'
pattern = r'dotcpp'
print(re.findall(pattern,string,re.I))#不区分大小写的方式匹配

输出结果为:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

1
['DOTcpp''dotcpp']

这种方式就匹配到了string字符串中所有符合pattern条件的内容,然后存放在一个列表中,也可以通过遍历的方式输出这些内容。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

4. split()方法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

split()方法又被称作分割方法,它能够以正则表达式的相关格式分割字符串,并返回列表,它的语法格式如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

1
re.split(pattern,string,[maxsplit],[flags])

这里多了一个maxsplit参数,用于表示最多的拆分次数,其余参数与上面一致。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

我们通过最简单的例子来看一下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

1
2
3
import restring = 'this is www.dotcpp.com 'pattern = r' 'print(re.split(pattern,string,re.I))
输出结果为:
['this''is''www.dotcpp.com ']

我们通过通过分割把字符串中的信息存放到了一个列表中,此用法在学习中会经常用到。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

还可以通过数字来分割字符串,例如:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

1
2
3
4
import re
string = 'A123456B789C'
pattern = r'\d*'
print(re.split(pattern,string,maxsplit=10))

输出结果为:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

1
['', 'A', '', 'B', '', 'C', '']

在这个例子中,从输出结果可以看出通过数字分割了整个字符串,如果我们更改了\d*为\d?还会出现不同的内容,具体使用可以多多参考上一节的内容。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

5. sub()方法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

Sub方法可以替换字符串中的内容,语法格式如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

1
re.sub(pattern,repl,string,count,[flags])

repl为替换的字符串,count为替换的最大次数,默认为0,其余参数与上面一致。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

我们在生活中经常会隐藏手机号的信息来保护隐私,我们通过sub方法来进行了解一下,代码如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

1
2
import restring = '号码为:18812345678'#假定手机号为18812345678pattern = r'\d'print(re.sub(pattern,'x',
string))

输出结果为:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

1
号码为:xxxxxxxxxxx

这样就把我们输入的手机号内容给替换掉了。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

 6. 总结文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

关于正则表达式我们就简单的介绍到这里,实际上正则表达式中的内容还有很多,有兴趣的可以去参考re模块去进一步了解,上一节我们汇总的元字符结合这一节学习的几种方法,可以从字符串中筛选出各种各样的信息,大家可以通过下面习题进行简单的练习。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

 7. 习题文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

1. 匹配一个0-9之间任意数字文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

2. <div>中国</div>,用正则匹配出标签里面的内容(“中国”),其中class的类名是不确定的文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

3. 字符串a = "not 404 found 编程 99 苏州 dotcpp",每个词中间是空格,用正则过滤掉英文和数字,最终输出"编程  苏州"文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

8. 题解文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

1. 代码:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

1
2
3
4
5
import re
string="""13\n122\n95\n669\n132\n072\n093\n4d"""
test = re.compile('(?<![0-9])[0-9]{1,3}(?!\w)')
= test.findall(string)
print( t )

输出:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

1
['13''122''95''669''132''072''093']

2. 代码:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

1
2
3
4
import re
string = '<div>中国</div>'
test = re.findall(r'<div class=".*">(.*?)</div>',string)#.*?为提取文本
print(test)

输出:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

1
['中国']

3. 代码:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

1
2
3
4
5
6
7
8
9
import re
string = 'not 404 found 编程 99 苏州 dotcpp'
list = string.split(' ')
test = re.findall('\d+|[a-zA-Z]+',string)
for in test:
    if in list:
        list.remove(i)
new = ' '.join(list)
print(new)

输出:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html

1
编程 苏州
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/26709.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/yunda/26709.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定