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

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

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 怎样免费完美的把PDF转Word?

    怎样免费完美的把PDF转Word?简介PDF可以分为文字型PDF和图片型PDF,文字型PDF即可以选中文字内容的PDF,反之图片型PDF即无法选中文字的PDF,其内容实际上是图片。本文针对不同类型,介绍PDF转Word方法,可以说是目前的最优解,没有之一。文字型PDF转Word方法1-直接用Word打开优点简单方便缺点部分样式丢失,排版错位,转换并不完美部分文件会有乱码无法识别图片型PDF里的文字总结适合对样式不敏感,主要关心正文内容的用户文字型PDF转Word方法2-使用超级PDF在线工具可以看到Word.

  • QT多线程实战_Qt多线程开发项目

    QT多线程实战_Qt多线程开发项目文章目录需求的提出多线程线程间通信需求的提出窗口本身就是一个死循环,在这样一个死循环中执行任何耗时的操作,都会导致程序崩溃。所以多线程对于窗口编程而言是必要的。例如,在窗口中拖入一个pushButton和lineEdit,将pushButton的名字改为pbStart,然后为其绑定一个函数,函数中创建一个死循环,并让死循环中的内容实时输出到lineEdit。接下来设计一个逻辑,当点击pbStart之后,开始执行死循环,同时按钮内容变为Stop;当按钮内容为Stop时,点击按钮,停止执行死循环。所以

  • 零基础学Java(7)大数

    零基础学Java(7)大数大数如果基本的整数和浮点数精度不能够满足需求,那么可以使用java.math包中两个很有用的类:BigInteger和BigDecimal。这两个类可以处理包含任意长度数字序列的数值。BigInte

  • wing是什么_124个叶结点的完全二叉树

    wing是什么_124个叶结点的完全二叉树设一个 n 个节点的二叉树 tree 的中序遍历为(1,2,3,…,n),其中数字 1,2,3,…,n 为节点编号。每个节点都有一个分数(均为正整数),记第 i 个节点的分数为 di,tree 及它的每个子树都有一个加分,任一棵子树 subtree(也包含 tree 本身)的加分计算方法如下:subtree的左子树的加分 × subtree的右子树的加分 + subtree的根的分数若某个子树为空,规定其加分为 1。叶子的加分就是叶节点本身的分数,不考虑它的空子树。试求一棵符合中序遍历为(1,2,

  • C#–winform界面美化[通俗易懂]

    C#–winform界面美化[通俗易懂]1、工控上位机界面总结(参考贴:https://blog.csdn.net/zqrhzyj/article/details/76638948)一般的工控界面分成三部分:(1)、标题菜单部分,即项目名称、界面菜单等(2)、数据显示及按钮等部分,即图形显示区,可以显示工艺流程图,采集到的相关数据信息、控制按钮等。(3)、尾部部分,可以添加公司的相关信息等。…

  • ansi编码转换器安卓版_ansi编码批量转换器

    ansi编码转换器安卓版_ansi编码批量转换器这是ansi编码批量转换器,是一款转换器支持多种文字编码格式的软件。软件简介ansi编码批量转换器是款转换器支持多种文字编码格式的软件。可以将txt编码转换成自己手机所支持的编码方式,方便于你手机看小说,让你轻松转换,小说快速观看!软件功能本工具能把字符串(包括汉字)转换成10进制或16进制的ANSI码,以空格分开,另外能把上述格式的10进制或16进制的ANSI码转换成字符串(包括汉字)。相关知识…

发表回复

您的电子邮箱地址不会被公开。

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