python正则

python中正则基本概念(默认是贪婪匹配):

贪婪模式:一直匹配到最大满足条件。
非贪婪模式:匹配到最小满足条件情况。

关键字字符:
    .    任意一个字符
    *    {0,无穷} 贪婪匹配
    ?    等价于{0,1}?  0个或者1个,贪婪匹配。
    +    {1,无穷} 贪婪匹配
    |    或表达式   表达式1|表达式2|表达式3   可以匹配多个满足结果的表达式。
    []    匹配括号内的任意一个字母。
    {m,n}    匹配前面的字母或者表达式m到n次。
    
    
    \w    匹配字母数字和下划线
    \W    \w的逆运算
    \d    匹配0-9的数字==[0-9]
    \D    非数字


贪婪模式转非贪婪模式:需要加问号?
    如匹配?的贪婪匹配:对?进行转化
    import re
    a="abc#ab"  #匹配##包裹的dog和cat
    result=re.findall("(?:a)(?:b)c?",a)    #
    print(result)    #['abc', 'ab']
    result=re.findall("(?:a)(?:b)c??",a)
    print(result)    #['ab', 'ab']

    匹配{m,n}的贪婪匹配,对{}进行转化
    import re
    a="abcdef#ijkl#gh#"
    result=re.findall("[a-z]{3,6}",a)
    print(result)    #['abcdef', 'ijkl']
    result=re.findall("[a-z]{3,6}?",a)
    print(result)    #['abc', 'def', 'ijk']

    匹配.*?的贪婪匹配转化
    import re
    a="hello###word***word"  
    result=re.findall("hello.*word",a)
    print(result)    #['hello###word***word']
    result=re.findall("hello.*?word",a)
    print(result)    #['hello###word']

匹配非字母和数字问题:
    re.findall(“[^a-zA-Z0-9]”,a)  #匹配非英文字母和非数字
    \W==[^a-zA-Z0-9_]  #匹配非英文字母和非数字和非下划线。


正则表达式匹配关键字(满足条件的下标):使用m.start()方法
    [m.start() for m in re.finditer(“hello”,String)]

正则中前瞻(又叫零宽断言):注意(?:不属于这个范围,能保存匹配到的字符)

零宽断言不会取匹配到的字符串,忽略对字符串的保存,匹配到的字符串

?= 代表零宽度正预测先行断言,它断言自身出现的位置的后面可以匹配后面跟的表达式。

?<= 代表零宽度正回顾后发断言,它断言自身出现的位置的前面可以匹配后面跟的表达式。

?! 代表零宽度负预测先行断言,它断言自身出现的位置的后面不可以匹配后面跟的表达式。

?<! 代表零宽度负回顾后发断言,它断言自身出现的位置的后面不可以匹配后面跟的表达式。

提前看后面的字符,在下次匹配中匹配提前看到的字符:(?=)(?!)只能放在匹配的后面

pattern(?=pattern):匹配后面满足的模式的字符串。肯定先行断言

pattern(?!pattern):匹配后面不满足的模式的字符串。否定先行断言

比如匹配windows95windows2000中满足windows95和windows2000的windows

re.findall("windows(?:95|2000)|95",a)   ['windows95', 'windows2000']  影响后面95匹配

re.findall("windows(?=95|2000)|95",a)   ['windows', '95', 'windows']  不会影响后面的

re.findall("windows(?!95|2000)|95",a)    ['95']  影响后面

回溯后面的字符,虽然之前的字符已经考虑过可以回溯:(?<=)(?<!)只能放在匹配的前面

(?<=pattern)pattern:匹配前面已经匹配过满足的字符串。肯定回溯断言

(?<!pattern)pattern: 匹配前面已经匹配过不满足的字符串。否定回溯断言

匹配空格内的单词:a="a b c d e"

re.findall("(?<= )[a-z](?= )",a)   ['b', 'c', 'd']  断言匹配不会匹配括号内的。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值