美文网首页
python常用正则表达式及示例

python常用正则表达式及示例

作者: 全村希望gone | 来源:发表于2020-05-04 20:38 被阅读0次

    前言

    写了一整天正则表达式,把之前看了很久的但没理解的都弄懂了

    问题

    • *+?的区别

    不知道你们有没有这个问题,反正我特地查过,但是别人的回答都没怎么看懂,网上是这么说的

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

    看完之后还是一头雾水,直接看例子

    import re
    
    text = '你你你你你你你好'
    # 为了防止语句出现None的情况,所以加以限制
    if re.search(r'你*好', text):
        text0 = re.search(r'你*好', text).group()
        print('text0:' + text0)
    if re.search(r'你+好', text):
        text1 = re.search(r'你+好', text).group()
        print('text1:' + text1)
    if re.search(r'你?好', text):
        text2 = re.search(r'你?好', text).group()
        print('text2:' + text2)
    

    输出如下

    text0:你你你你你你你好
    text1:你你你你你你你好
    text2:你好
    

    初步理解网上所说的含义

    • “re* 匹配0个或多个的表达式”:当模式存在时,匹配多个,当模式不存在时,匹配0个。
    • “re+ 匹配1个或多个的表达式”:用+表明模式必须要存在,如果存在1个的话就匹配1个,如果存在多个的话就匹配多个。
    • “re? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式”:当模式存在时,匹配1个,当模式不存在时,匹配0个。
      来验证上面的结论
    import re
    
    text = '好'
    # 为了防止语句出现None的情况,所以加以限制
    if re.search(r'你*好', text):
        text0 = re.search(r'你*好', text).group()
        print('text0:' + text0)
    if re.search(r'你+好', text):
        text1 = re.search(r'你+好', text).group()
        print('text1:' + text1)
    if re.search(r'你?好', text):
        text2 = re.search(r'你?好', text).group()
        print('text2:' + text2)
    

    输出如下

    text0:好
    text2:好
    

    没有text1,表明当模式不存在时,+是无法进行匹配的。text0和text2输出为“好”,表明当模式不存在时,匹配0个。再结合第一份代码,可以得出上面的结论是对的。 再总结一下就是,当模式存在时,*和+作用是一样的;当模式不存在时,*和?作用是一样的,当模式存在且只匹配到一个时,这三个是一样的。

    • [ ] 的作用

    这个相对好懂,网上的回答

    • [...] 用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'
      先抛结论:当[ ]单独使用时,模式存在时,[ ]匹配1个,模式不存在时,[ ]匹配0个。看起来有点像?,确实如此,可以把方括号内的内容想象成一个集合,每个元素都是独立的,然后在这个集合上加上一个?。当[ ]和后面的元素联合起来时,只有当方括号内的模式存在时,才匹配一个(这个是我后来发现的,没有举例子)。
      直接看例子
    import re
    
    text = '我很喜欢你'
    # 为了防止语句出现None的情况,所以加以限制
    if re.search(r'[喜欢爱讨厌]', text):
        text0 = re.search(r'[喜欢爱讨厌]', text).group()
        print('text0:'+text0)
    if re.search(r'[喜欢爱讨厌]你', text):
        text1 = re.search(r'[喜欢爱讨厌]你', text).group()
        print('text1:'+text1)
    if re.search(r'[爱讨厌]', text):
        text2 = re.search(r'[爱讨厌]', text).group()
        print('text2:'+text2)
    

    输出如下

    text0:喜
    text1:欢你
    

    可以看出,[ ]真的是惜字如金啊,但是我们可以把[ ]和+*联合使用(至于?,[ ]本来的功能无形中就相当于加了个?)。
    例子

    import re
    
    text = '我很喜欢你'
    # 为了防止语句出现None的情况,所以加以限制
    if re.search(r'[喜欢爱讨厌]*', text):
        text0 = re.search(r'[喜欢爱讨厌]*', text).group()
        print('text0:'+text0)
    if re.search(r'[喜欢爱讨厌]+你', text):
        text1 = re.search(r'[喜欢爱讨厌]+你', text).group()
        print('text1:'+text1)
    if re.search(r'[爱讨厌]*', text):
        text2 = re.search(r'[爱讨厌]*', text).group()
        print('text2:'+text2)
    if re.search(r'[爱讨厌]+', text):
        text3 = re.search(r'[爱讨厌]+', text).group()
        print('text3:'+text3)
    

    输出如下

    text0:
    text1:喜欢你
    text2:
    

    可以看出,+的作用和上面说的还是一样的,当模式存在时,匹配多个,当模式不存在时匹配0个;但是*变成了无论模式是否存在,都匹配0个。

    • | 的作用

    这个也很好理解,就和平时变成用的“或”差不多,网上的解释:

    • a| b 匹配a或b
      我之前有个误区就是 | 只对紧挨着 | 的元素做或操作,看例子
    import re
    
    text = '我很喜欢你'
    # 为了防止语句出现None的情况,所以加以限制
    if re.search(r'喜欢|爱', text):
        text0 = re.search(r'喜欢|爱', text).group()
        print('text0:'+text0)
    text = '我很喜你'
    # 为了防止语句出现None的情况,所以加以限制
    if re.search(r'喜欢|爱', text):
        text0 = re.search(r'喜欢|爱', text).group()
        print('text1:'+text0)
    

    输出如下

    text0:喜欢
    

    我之前以为text0的输出会是“欢”,是因为我把每个字符都看成是独立的元素,但是 | 并不是这样,切记。
    今天主要用这几个,等我学了更多之后再回来更新。

    参考资料

    [1] Python3 正则表达式(这个总结的是真好,我每次都看这个,就是例子太少了,看完了之后只能自己去试错。)

    相关文章

      网友评论

          本文标题:python常用正则表达式及示例

          本文链接:https://www.haomeiwen.com/subject/vynyghtx.html