本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。
以下文章一级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>