• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Python爬虫必学知识点:正则表达式讲解

python 搞java代码 3年前 (2022-05-21) 19次浏览 已收录 0个评论

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。

以下文章一级AI入门学习 ,作者小伍哥

刚接触Python的新手、小白,可以复制下面的链接去免费观看Python的基础入门教学视频

https://v.douyu.<a href="https://www.gaodaima.com/tag/com" title="查看更多关于com的文章" target="_blank">com</a>/author/y6AZ4jn9jwKW

www#gaodaima.com来源gaodaimacom搞#^代%!码网搞代码

 

 

前言

正则表达式(Regular Expression),就是具有一定规则的表达式。通过正则表达式引擎,将这些规则转换为正则表达式对象,然后再去文本中搜索能够与之匹配的字符串。

正则表达式的语法都是一样的,只是不同编程语言的实现不同,大部分都是师从Perl。

对Perl语言有所了解的朋友,学习python正则应该是手到擒来。

正则表达式入门

Python中的re模块提供了强大的正则表达式功能。

而第三方模块regex提供了与标准库re模块兼容的API接口, 同时还提供了额外的功能和更全面的Unicode支持。

 

匹配字符

大多数字母和字符只会匹配自身,例如:python只会匹配自己,不会匹配Python。

但是有一些字符串,它们不表示自身,而是具有一些特殊含义,只能通过转义之后才表示自身。

这些字符包括:

. ^ $ * + ? { } [ ]  | ( )

 

【.】

在默认模式中,匹配除换行外所有字符,如果指定了DOTALL标签,则表示任意字符

<span>import</span><span> re

</span><span>"""</span><span>
re.findall(pattern, string, flags=0)
pattern: 匹配规则,字符串
string: 需要去匹配的字符串

从左到右进行扫描,匹配按找到的顺序返回。如果样式里存在一个或多个组,就返回一个组合列表
</span><span>"""</span><span>

re.findall(</span><span>"</span><span>ab.</span><span>"</span>, <span>"</span><span>abc</span><span>"</span><span>) 
</span><span>#</span><span> Out[1]: ["abc"]</span>
<span>
re.findall(</span><span>"</span><span>ab.</span><span>"</span>, <span>"</span><span>ab
</span><span>"</span><span>) 
</span><span>#</span><span> Out[2]: []</span>
<span>
re.findall(</span><span>"</span><span>ab.</span><span>"</span>, <span>"</span><span>ab
</span><span>"</span><span>, re.DOTALL)
</span><span>#</span><span> Out[3]: ["ab
"]</span>

 

【^】

匹配字符串的开头, 如果是MULTILINE模式,匹配每行开头(
之后)的首个符号。

在字符集中可表示”非”,[^a]表示除字符a之外的字符。

re.findall(<span>"</span><span>^ab</span><span>"</span>, <span>"</span><span>abcda
abddd</span><span>"</span><span>)                                     
</span><span>#</span><span> Out[4]: ["ab"]</span>
<span>
re.findall(</span><span>"</span><span>^ab</span><span>"</span>, <span>"</span><span>abcda
abddd</span><span>"</span><span>, re.MULTILINE)
</span><span>#</span><span> Out[5]: ["ab", "ab"]</span>
<span>
re.findall(</span><span>"</span><span>[^a]</span><span>"</span>, <span>"</span><span>aaa
bbb</span><span>"</span><span>)
</span><span>#</span><span> Out[6]: ["
", "b", "b", "b"]</span>

 

【$】

匹配字符串的末尾,或者在字符串末尾换行符的前一个字符。

在 MULTILINE 模式下匹配每行末尾(
之前)的字符。

re.findall(<span>"</span><span>ab$</span><span>"</span>, <span>"</span><span>abcdab
abdab</span><span>"</span><span>)                                   
</span><span>#</span><span> Out[7]: ["ab"]</span>

<span>#</span><span> 上面结果中的 ab 是 
 前面的还是后面的呢?进行如下测试,发现是后面的 ab 被匹配了</span>
re.findall(<span>"</span><span>ab.$</span><span>"</span>, <span>"</span><span>abcdab1
abdab2</span><span>"</span><span>)
</span><span>#</span><span> Out[8]: ["ab2"]</span>

<span>#</span><span> 在 MULTILINE 模式下,两个都被匹配了</span>
re.findall(<span>"</span><span>ab$</span><span>"</span>, <span>"</span><span>abcdab
abdab</span><span>"</span><span>, re.MULTILINE)
</span><span>#</span><span> Out[9]: ["ab", "ab"]</span>

<span>#</span><span> 而对 $ 在换行结尾的字符串中匹配时,会得到两个空字符,一个在换行符之前,一个在字符串的末尾</span>
re.findall(<span>"</span><span>$</span><span>"</span>, <span>"</span><span>abcdab1
</span><span>"</span><span>)
</span><span>#</span><span> Out[10]: ["", ""]</span>

 

【*】

匹配前一个规则0次或无限次

re.findall(<span>"</span><span>ab*</span><span>"</span>, <span>"</span><span>a</span><span>"</span><span>)
</span><span>#</span><span> Out[11]: ["a"]</span>
<span>
re.findall(</span><span>"</span><span>ab*</span><span>"</span>, <span>"</span><span>ab</span><span>"</span><span>)
</span><span>#</span><span> Out[12] ["ab"]</span>
<span>
re.findall(</span><span>"</span><span>ab*</span><span>"</span>, <span>"</span><span>abbbbbbbbbbbbbb</span><span>"</span><span>)
</span><span>#</span><span> Out[13] ["abbbbbbbbbbbbbb"]</span>

 

【+】

匹配前一个规则1次或无限次

re.findall(<span>"</span><span>ab+</span><span>"</span>, <span>"</span><span>a</span><span>"</span><span>)
</span><span>#</span><span> Out[14]: []</span>
<span>
re.findall(</span><span>"</span><span>ab+</span><span>"</span>, <span>"</span><span>ab</span><span>"</span><span>)
</span><span>#</span><span> Out[15] ["ab"]</span>
<span>
re.findall(</span><span>"</span><span>ab+</span><span>"</span>, <span>"</span><span>abbbbbbbbbbbbbb</span><span>"</span><span>)
</span><span>#</span><span> Out[16] ["abbbbbbbbbbbbbb"]</span>

 

【?】

匹配前一个规则0次或1次

re.findall(<span>"</span><span>ab?</span><span>"</span>, <span>"</span><span>a</span><span>"</span><span>)
</span><span>#</span><span> Out[17]: ["a"]</span>
<span>
re.findall(</span><span>"</span><span>ab?</span><span>"</span>, <span>"</span><span>ab</span><span>"</span><span>)
</span><span>#</span><span> Out[18] ["ab"]</span>
<span>
re.findall(</span><span>"</span><span>ab?</span><span>"</span>, <span>"</span><span>abbbbbbbbbbbbbb</span><span>"</span><span>)
</span><span>#</span><span> Out[19] ["ab"]</span>

 

【.?,*?,??】

.,*,?修饰符都是贪婪的,会尽可能的匹配更多的字符串

贪婪的我,当然是赞越多越好呀。

而在这些修饰符后面加上?,便成了非贪婪模式,会尽可能少的匹配字符串

re.findall(<span>"</span><span><.*></span><span>"</span>, <span>"</span><span><a>bcd></span><span>"</span><span>)
</span><span>#</span><span> Out[20] ["<a>bcd>"]</span>
<span>
re.findall(</span><span>"</span><span><.*?></span><span>"</span>, <span>"</span><span><a>bcd></span><span>"</span><span>)
</span><span>#</span><span> Out[21] ["<a>"]</span>

 

{m}

指定前面的正则表达式出现的次数,出现次数必须完全一致。

re.findall(<span>"</span><span>a{3}</span><span>"</span>, <span>"</span><span>aa</span><span>"</span><span>) 
</span><span>#</span><span> Out[22]: []</span>
<span>
re.findall(</span><span>"</span><span>a{3}</span><span>"</span>, <span>"</span><span>aaaaa</span><span>"</span><span>)
</span><span>#</span><span> Out[23]: ["aaa"]</span>

 

{m, n}

指定前面的正则表达式出现的次数在m~n之间,尽可能多的匹配,匹配的下界是m,上界是n。

若缺省m,下界为0,若缺省n,为不设上界,即无限次。

re.findall(<span>"</span><span>a{3, 5}</span><span>"</span>, <span>"</span><span>aaaa</span><span>"</span><span>) 
</span><span>#</span><span> Out[24]: []</span>

<span>#</span><span> 3,5 之间不能添加空格</span>
re.findall(<span>"</span><span>a{3,5}</span><span>"</span>, <span>"</span><span>aaaa</span><span>"</span><span>)
</span><span>#</span><span> Out[25]: ["aaaa"]</span>
<span>
re.findall(</span><span>"</span><span>a{3,}</span><span>"</span>, <span>"</span><span>aaaa</span><span>"</span><span>)
</span><span>#</span><span> Out[26]: ["aaaa"]</span>
<span>
re.findall(</span><span>"</span><span>a{,5}</span><span>"</span>, <span>"</span><span>aaaa</span><span>"</span><span>)
</span><span>#</span><span> Out[27] ["aaaa", ""]</span>

 

{m, n}?

  • 即非贪婪模式,尽可能少的匹配字符串。
re.findall(<span>"</span><span>a{3,}?</span><span>"</span>, <span>"</span><span>aaaaa</span><span>"</span><span>)
</span><span>#</span><span> Out[28] ["aaa"]</span>

 

【】

  • 转义特殊字符。如”.”只表示.,而不再是表示任意字符。
  • 匹配字符需要转义,用表示
re.findall(<span>"</span><span>.</span><span>"</span>, <span>"</span><span>aa</span><span>"</span><span>)
</span><span>#</span><span> Out[29] []</span>
<span>
re.findall(</span><span>"</span><span>.</span><span>"</span>, <span>"</span><span>aa.</span><span>"</span><span>)
</span><span>#</span><span> Out[30] ["."]</span>

 

反斜杠灾难:反斜杠具有转义作用,如果需要匹配的字符串中存在多个,就需要调加相应数量的来转义

re.findall(<span>"</span><span>\ab</span><span>"</span>, <span>"</span><span>abc</span><span>"</span>) <span>#</span><span> ["ab"]</span>
<span>"""</span><span>
在反复使用反斜杠的正则中,这会导致大量重复的反斜杠,
并使得生成的字符串难以理解。
解决方案:
  使用 Python 的原始字符串表示法来表示正则表达式;
  "r" 为前缀的字符串,反斜杠不再表示转义
</span><span>"""</span><span>
re.findall(r</span><span>"</span><span>ab</span><span>"</span>, <span>"</span><span>abc</span><span>"</span>)  <span>#</span><span> ["ab"]</span>
<span>
re.findall(r</span><span>"</span><span>
</span><span>"</span>, <span>"</span><span>
</span><span>"</span>)       <span>#</span><span> ["
"]</span>

 

[]

表示字符集集合。匹配该字符需要转义[,]

<span>#</span><span> 1、单独列出,匹配 a、b 或 c</span>
re.findall(<span>"</span><span>[abc]</span><span>"</span>, <span>"</span><span>ab.</span><span>"</span><span>)
</span><span>#</span><span> Out[31]: ["a", "b"]</span>

<span>"""</span><span>
2、字符范围:
[a-j]: 表示小写字母 a~j
[1-6]:表示数字 1~6
转义: 如 [a-z] 或者它的位置在首位或者末尾([-a] 或 [a-]),它就只表示普通字符 "-"。
</span><span>"""</span><span> 
re.findall(</span><span>"</span><span>[a-z]</span><span>"</span>, <span>"</span><span>-</span><span>"</span><span>)
</span><span>#</span><span> Out[32]: ["-"]</span>
<span>
re.findall(</span><span>"</span><span>[-a]</span><span>"</span>, <span>"</span><span>-</span><span>"</span><span>)
</span><span>#</span><span> Out[33]: ["-"]</span>
<span>
re.findall(</span><span>"</span><span>[a-]</span><span>"</span>, <span>"</span><span>-</span><span>"</span><span>)
</span><span>#</span><span> Out[34]: ["-"]</span>

<span>"""</span><span>
3、特殊字符失去特殊含义
  比如 [(+*)] 只会匹配这几个字符 "(", "+", "*", or ")"。
</span><span>"""</span><span>
re.findall(</span><span>"</span><span>[(+*)]</span><span>"</span>, <span>"</span><span>+-*/()</span><span>"</span><span>)
</span><span>#</span><span> Out[35] ["+", "*", "(", ")"]</span>

<span>"""</span><span>
4、字符类
 可以使用字符类:w,S 等,它们可以匹配的字符由 ASCII 或者 LOCALE 模式决定。
</span><span>"""</span><span>
re.findall(</span><span>"</span><span>[w]</span><span>"</span>, <span>"</span><span>abfagg-/*-</span><span>"</span><span>)
</span><span>#</span><span> Out[36] ["a", "b", "f", "a", "g", "g"]</span>

<span>"""</span><span>
5、取反
如果集合首字符是 "^" ,所有不在集合内的字符将会被匹配
[^^] 将匹配所有字符,除了 "^". 
^ 如果不在集合首位,就没有特殊含义。
</span><span>"""</span>
<span>#</span><span> 非 w 定义的字母</span>
re.findall(<span>"</span><span>[^w]</span><span>"</span>, <span>"</span><span>abfagg-/*-</span><span>"</span><span>)
</span><span>#</span><span> Out[37] ["-", "/", "*", "-"]</span>

<span>"""</span><span>
6、匹配字符 "]"
两种方法
  加上反斜杠
  放到集合首位
</span><span>"""</span>
<span>#</span><span> 加上反斜杠</span>
re.findall(<span>"</span><span>]</span><span>"</span>, <span>"</span><span>abc]</span><span>"</span><span>)
</span><span>#</span><span> Out[38] ["]"]</span>

<span>#</span><span> 放到集合首位</span>
re.findall(<span>"</span><span>[]{}]</span><span>"</span>, <span>"</span><span>]abc</span><span>"</span><span>)
</span><span>#</span><span> Out[39] ["]"]</span>

 

【|】

或。A|B,匹配正则表达式A或B,A、B可以是任何正则表达式。

如果A匹配成功,则不会再匹配B。

匹配|字符需要转义,|或[|]

re.findall(<span>"</span><span>a|b</span><span>"</span>, <span>"</span><span>acb</span><span>"</span><span>)
</span><span>#</span><span> Out[40] ["a", "b"]</span>
<span>
re.findall(</span><span>"</span><span>[|]</span><span>"</span>, <span>"</span><span>ab|c</span><span>"</span><span>)
</span><span>#</span><span> Out[41] ["|"]</span>

 

(…)

小括号,可以组合表达式,匹配括号内的组合表达式,并标注表达式的开始和结束位置,可用于后续捕获

每对小括号代表一个组合,可以通过
umber的方式引用组合,1表示第一个组合。

要匹配字符 ( 或者 ), 用 ( 或 ), 或者放在字符集合里: [(], [)]。

re.findall(<span>"</span><span>a(b+)</span><span>"</span>, <span>"</span><span>abbb</span><span>"</span><span>)
</span><span>#</span><span> Out[42] ["bbb"]</span>
<span>。
re.findall(r</span><span>"</span><span>(b)a1</span><span>"</span>, <span>"</span><span>bab</span><span>"</span><span>)
</span><span>#</span><span> Out[43] ["b"]</span>

 

总结


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Python爬虫必学知识点:正则表达式讲解

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址