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

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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Android setContentView流程[通俗易懂]

    Android setContentView流程[通俗易懂]MainActivity继承Activity的流程MainActivity继承至Activityimportandroid.app.Activity;importandroid.os.Bundle;publicclassMainActivityextendsActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(saved

    2022年6月26日
    30
  • 模板语法[通俗易懂]

    什么是模板模板语法分类模板语法之变量语法为{{}}:在Django模板中遍历复杂数据结构的关键是句点字符.(也就是点)views.pytemplate/index.html注意

    2022年3月29日
    43
  • Java Calendar 日历类的时间操作 Timestamp Date Calendar 相互转换

    Java Calendar 日历类的时间操作 Timestamp Date Calendar 相互转换JavaCalendar日历类的时间操作,这也许是Java环境下创建和管理日历及操作时间最简单的一个方案了,示范代码也很简单。演示了获取时间,日期时间的累加和累减,以及日期时间的比较。原文地址:blog.csdn.net/joyous/article/details/9630893注意事项:Calendar的month从0开始,也就是全年12个月由0~1…

    2022年4月26日
    53
  • 【STM32H7的DSP教程】第50章 STM32H7的样条插补实现,波形拟合丝滑顺畅[通俗易懂]

    【STM32H7的DSP教程】第50章 STM32H7的样条插补实现,波形拟合丝滑顺畅[通俗易懂]完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547第50章STM32H7的样条插补实现,波形拟合丝滑顺畅本章节讲解样条插补,主要用于波形拟合,平滑过渡。目录50.1初学者重要提示50.2样条插补介绍50.3样条插补实现50.3.1函数arm_spline_init_f3250.3.2函数arm_spline_f3250.3.3使用样条插补函数的关键点50….

    2022年9月6日
    5
  • phpstudy中的mysql

    phpstudy中的mysql

    2021年10月14日
    58
  • xray安全漏洞检测(高效能)

    xray安全漏洞检测(高效能)风险告知:请勿在未授权情况下,对网站进行安全扫描,存在很大的法律风险,详细请了解网络安全法。血的案例:”白帽黑客”找漏洞被抓引争议世纪佳缘否认”钓鱼”–传媒–人民网在正式运行xray生成配置文件config.yaml后,请优先修改配置项,确认扫描范围,再重新启动xray如不预先配置,默认扫描所有站点,存在非常大的法律风险,请知悉!!!xray是一款功能强大的安全评估工具,主要特性有:检测速度快。发包速度快;漏洞检测算法高效。 支持范围广。大至OWASPTo.

    2022年5月15日
    52

发表回复

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

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