Python正则表达式简易教程

Python正则表达式简易教程

1. 符号介绍

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

表格来自网络

2. re模块

​ Python 的 re 库提供了整个正则表达式的实现,利用 re 库我们就可以在 Python 中使用正则表达式。我们在这里主要介绍 re 库中的三个函数: findall() search() sub()

3. 基本使用示例

主要介绍 . * ? () 四个正则符号

  • . 匹配任意字符,除了换行符

    import re
    ​
    string = 'xxhelloxxsadasxxWorldxx!@163.com'
    ans = re.findall('h.', string)
    print(ans)

    he

    首先,我们在这里引入了re模块,并且声明了变量string,我们写下了第一个正则表达式 h.,将stringh.传入了findall()函数,打印结果,得到了 he 这个结果。

  • * 匹配0个或多个表达

    import re
    ​
    string = 'xxhelloxxsadasxxWorldxx!@163.com'
    ans = re.findall('l*', string)
    print(ans)

    ['', '', 'll', '', '', '', '', 'l', '', '', '', '', '', '', '', '', '', '', '']

    * 会对字符串中的每个位置进行比较,若是*号前的表达式,则在列表中相应的位置返回表达式,可连续匹配。

  • ? 匹配 0 个或 1 个由前面的正则表达式定义的片段,非贪婪方式

        import re
    ​
        string = 'xxhelloxxsadasxxWorldxx!@163.com'
        ans = re.findall('l?', string)
        print(ans)

    ['', '', 'l', 'l', '', '', '', '', 'l', '', '', '', '', '', '', '', '', '', '', '']

    注: 从结果可以看出,与*的不同之处。

  • () 匹配括号内的表达式,也表示一个组

    import re
    ​
    string = 'xxhelloxxsadasxxWorldxx!@163.com'
    ans = re.findall('@(.*).com', string)
    print(ans)

    ['163']

    注: 从结果可以看出,返回的是表达式中括号内的内容。

 

4. 基本组合使用

主要介绍 .* .*?两种组合

  • .* 贪婪匹配

    import re
    ​
    string = 'xxhelloxxsadasxxWorldxx!@163.com'
    ans = re.findall('xx(.*)xx', string)
    print(ans)

    ['helloxxsadasxxWorld']

    注: 匹配两个xx中间的内容,返回了第一个xx和最后一个xx中间的所有内容,是贪婪匹配

  • .*?非贪婪匹配

    import re
    ​
    string = 'xxhelloxxsadasxxWorldxx!@163.com'
    ans = re.findall('xx(.*?)xx', string)
    print(ans)

    ['hello', 'World']

 

注: 贪婪模式是一次尽可能多的匹配字符非贪婪模式一次尽可能少的匹配字符

 

5. findall() 与search()

  • findall() 寻找符合表达式的所有结果

    import re
    ​
    string = 'xxhelloxxsadasxxWorldxx!@163.com'
    ans = re.findall('xx?', string)
    print(ans)

    ['xx', 'xx', 'xx', 'xx']

     

  • search() 寻找符合表达式的第一个结果

    import re
    ​
    string = 'xxhelloxxsadasxxWorldxx!@163.com'
    ans = re.search('xx?', string).group()
    print(ans)

    xx

这两个函数都不会因为第一个字符匹配失败而结束匹配。

6. sub()

import re
​
string = 'xxhelloxxsadasxxWorldxx!@163.com'
ans = re.sub('\d{1}',"K",string)
print(ans)

xxhelloxxsadasxxWorldxx!@KKK.com

从结果里,我们可以看见,163 已经被替换成了 K;sub() 的第一个参数,是正则表达式,第二个参数是要替换的字符,第三个参数是目标字符串。

注:\d 后的{1}是说明只匹配一个数字,+表示尽可能多的

歌词提取

string = """<div class="lyric__cont_box" id="lrc_content">
    <p>This is man's world </p>
    <p>By falling for you</p>
    <p>想摘下星星给你</p>
    <p>摘下月亮给你</p>
    <p>摘下太阳给你</p>
    <p>你想要我都给你</p>
    <p>摘下星星给你</p>
    <p>摘下月亮给你 </p>
    <p>摘下太阳给你</p>
    <p>你想要我都给你 </p>
    <p>有时候你会烦恼 </p>
    <p>丧气满脑想着放弃 </p>
    <p>让我无法放心 girl </p>
    <p>总爱胡思乱想</p>
    <p>说我有所隐藏 </p>
    <p>让你感到伤心 girl </p>
    <p>……</p>
</div>"""
results = re.findall('<p>(.*?)</p>', string, re.S)
for result in results:
    print(result)

This is man's worldBy falling for you想摘下星星给你摘下月亮给你摘下太阳给你你想要我都给你摘下星星给你摘下月亮给你摘下太阳给你你想要我都给你有时候你会烦恼丧气满脑想着放弃让我无法放心 girl总爱胡思乱想说我有所隐藏让你感到伤心 girl……

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值