网络爬虫必备知识之正则表达式

1.正则表达式概念正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。许多程序

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

就库的范围,个人认为网络爬虫必备库知识包括urllib、requests、re、BeautifulSoup、concurrent.futures,接下来将结对re正则表达式的使用方法进行总结

1. 正则表达式概念

  正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

  许多程序设计语言都支持正则表达式进行字符串操作,并不是python独有,python的re模块提供了对正则表达式的支持。

  正则表达式内容太过于”深奥”,以下内容仅总结我平时使用过程中认为相对重要的点:常用匹配模式、泛匹配、贪婪匹配、分组匹配(exp)和re库函数

2. python正则常用匹配模式

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

2. re库使用说明

(1)match函数

  函数原型:def match(pattern, string, flags=0):

   尝试从字符串的起始位置匹配一个模式,如果起始位置没匹配上的话,返回None

content= "hello 123 4567 World_This is a regex Demo"
result = re.match('^hello\s\d\d\d\s\d{4}\s\w{10}.*Demo$',content)
print(result)
print(result.group()) #获取匹配的结果
print(result.span())  #获取匹配字符串的长度范围

  输出:

网络爬虫必备知识之正则表达式

(2)泛匹配

  上面的代码正则表达式太复杂,我们可以使用下面的方式进行简化

content= "hello 123 4567 World_This is a regex Demo"
result = re.match('^hello.*Demo$',content)
print(result)
print(result.group())
print(result.span())

  输出结果一样,这样看起来就更简洁,以hello开头,中间匹配任意字符0次到多次,以Demo结尾

(3)分组匹配

  为了匹配字符串中具体的目标,可以使用()进行分组匹配

content= "hello 123 4567 World_This is a regex Demo"
result = re.match('^hello\s(\d+).*Demo$',content)
print(result.group())
print(result.group(1))

  输出:

网络爬虫必备知识之正则表达式 

(4)命名方式的分组匹配

  (?<name>exp) :匹配exp,并捕获文本到名称为name的组里,也可以写成(?’name’exp)

content= "hello 123 4567 World_This is a regex Demo"
result = re.match('^hello\s(?P<num>\d+).*Demo$',content)
print(result.group())
print(result.group(1))
print(result.groupdict())

  输出:

网络爬虫必备知识之正则表达式

  采用命名分组方式,可以通过key‘num’获取匹配到的信息

(5)贪婪匹配

  意思就是一直匹配,匹配到匹配不上为止

content= "hello 123 4567 World_This is a regex Demo"
result = re.match('^hello.*(?P<name>\d+).*Demo$',content)
print(result.group())
print(result.group(1))
print(result.groupdict())

  输出:

网络爬虫必备知识之正则表达式

  最终结果输出的是7,出现这样的结果是因为被前面的.*给匹陪掉了,只剩下了一个数字,这就是贪婪匹配

  若要非贪婪匹配可以使用问号(?)

content= "hello 123 4567 World_This is a regex Demo"
result = re.match('^hello.*?(?P<name>\d+).*Demo$',content)
print(result.group())
print(result.group(1))
print(result.groupdict())

  这样就可以匹配123了

(6) 函数中添加匹配模式

  def match(pattern, string, flags=0)函数中的第三个参数flags设置匹配模式

  re.I:使匹配对大小写不敏感

  re.L:做本地化识别匹配

  re.S:使.包括换行在内的所有字符

  re.M:多行匹配,影响^和$

  re.U:使用unicode字符集解析字符,这个标志影响\w,\W,\b,\B

  re.X:该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解

  下面以re.I和re.S为例:

content= "heLLo 123 4567 World_This is a regex Demo"
result = re.match('hello',content,re.I)
print(result.group())

  输出:heLLo

  不加re.S情况

content= '''heLLo 123 4567 World_This is 
a regex Demo'''
result = re.match('.*',content)
print(result.group())

  输出:heLLo 123 4567 World_This is

  再看加re.S的情况

content= '''heLLo 123 4567 World_This is 
a regex Demo'''
result = re.match('.*',content,re.S)
print(result.group())

网络爬虫必备知识之正则表达式

  re库中大部分函数都有该flags参数

(7)search函数

  函数原型:def search(pattern, string, flags=0)

  扫描整个字符串,返回第一个匹配成功的结果

content= '''hahhaha hello 123 4567 world'''
result = re.search('hello.*world',content)
print(result.group())

  输出:hello 123 4567 world,如果将search改为match将提示异常,因为没有匹配到内容

(8)findall函数

  函数原型:def findall(pattern, string, flags=0)

  搜索字符串,以列表的形式返回所有能匹配的字串

content= '''
    <url>
        <loc>http://example.webscraping.com/places/default/view/Afghanistan-1</loc>
    </url>
    <url>
        <loc>http://example.webscraping.com/places/default/view/Aland-Islands-2</loc>
    </url>
    <url>
        <loc>http://example.webscraping.com/places/default/view/Albania-3</loc>
    </url>
    <url>
        <loc>http://example.webscraping.com/places/default/view/Algeria-4</loc>
    </url>
    <url>
        <loc>http://example.webscraping.com/places/default/view/American-Samoa-5</loc>
    </url>'''
urls = re.findall('<loc>(.*)</loc>',content)
for url in urls:
    print(url)

  输出:

网络爬虫必备知识之正则表达式

(9)sub函数

  函数原型:def subn(pattern, repl, string, count=0, flags=0)

  替换字符串中每一个匹配的子串后返回替换后的字符串

content= '''hahhaha hello 123 4567 world'''
str = re.sub('hello.*world','zhangsan',content)
print(str)

  输出:hahhaha zhangsan

(10)compile

  函数原型:def compile(pattern, flags=0)

  将正则表达式编译成正则表达式对象,方便复用该正则表达式

content= '''hahhaha hello 123 4567 world'''
pattern = 'hello.*'
regex = re.compile(pattern)
str = re.sub(regex,'zhangsan',content)
print(str)

  输出:hahhaha zhangsan

正则表达式,初见可能会很复杂,但只要一步一步来,会发现正则表达式其实并
没有想像中的那么困难,它的出现会让我们写出的代码简洁很多。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120044.html原文链接:https://javaforall.net

(0)
上一篇 2021年12月29日 下午9:00
下一篇 2021年12月29日 下午10:00


相关推荐

  • 使用Bootstrap 他写道网站

    使用Bootstrap 他写道网站

    2022年1月4日
    50
  • pycharm mac 激活码【2022.01最新】2022.03.12

    (pycharm mac 激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html1M2OME2TZY-eyJsaWNlbnNlSWQi…

    2022年3月13日
    219
  • 2000数据库置疑怎么处理_msdb数据库置疑的解决方法

    2000数据库置疑怎么处理_msdb数据库置疑的解决方法由于服务器意外的断电,导致SQLSERVER服务器上数据库出现“置疑”而无法使用,通过网上搜索,找到以下方法解决问题,这里记录一下:产生数据库置疑的时侯,数据库文件和日志文件都是存在的,如果数据库文件都不存在了,则要另当处理。1、停止数据库服务器,将数据库MDF文件和LDF文件复制备份一份2、启动数据库服务器,删除置疑的数据库3、仅用备份的数据库MDF文件附加数据库,sp_attach_…

    2022年8月20日
    14
  • java 软件运维面试题_运维面试题(一)

    java 软件运维面试题_运维面试题(一)一基础知识1什么是linux的daemon进程?和一般进程有什么区别?daemon进程又称为守护进程,是在系统启动就运行,系统关闭才停止的进程,独立于终端之外,不与客户端交互。一般进程在关闭终端后就停止了,而daemon进程不会停止。2通过free命令查看内存是,看到的buffer和cache各表示什么含义?Buffer的核心作用是用来缓冲,缓和冲击。比如你每秒要写100次硬盘,对系统冲…

    2022年6月9日
    53
  • [2018年新版]以太坊ETH挖矿教程

    [2018年新版]以太坊ETH挖矿教程一.准备工作1.硬件准备ETH以太坊挖矿主要是使用高端3G显存以上显卡来挖矿,因此你需要一台拥有以下设备的电脑:显卡:6张rx470或gtx1060以上显卡,显存推荐4G以上主板:需要有6个以上pci-e插槽,目前市面上有主板直插和转接板2种。一般来说直插6卡或者8卡主板较为稳定。电源:电源功率视显卡数量,一般6卡需要850w以上其他配件:CPU、内存、硬盘(推荐60G以上SSD)、延长线…

    2022年6月9日
    57
  • 消息称月之暗面寻求以100亿美元估值进行新一轮融资

    消息称月之暗面寻求以100亿美元估值进行新一轮融资

    2026年3月12日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号