正则表达式贪婪与懒惰实用技巧

1、只需要学贪婪和匹配,其他翻阅文档查一查即可

贪婪:尽可能往多的匹配(得到更多)典型模板:(.*)

懒惰:尽可能往少的匹配(更加准确)典型模板:(.*?)

>>> str = "<p>lazy<p>fei</p>qiang</p>"
>>> reg = "<p>(.*?)</p>"
>>> reg1 = "<p>(.*)</p>"
>>> re.search(reg,str)
<_sre.SRE_Match object; span=(0, 17), match='<p>lazy<p>fei</p>'>
>>> re.search(reg1,str)
<_sre.SRE_Match object; span=(0, 26), match='<p>lazy<p>fei</p>qiang</p>'>

技巧:贪婪是从后往前匹配的。

 

>>> str = "sssaaabbccbababaa"
>>> reg = "ab(.*)"
>>> re.search(reg,str)
<re.Match object; span=(5, 17), match='abbccbababaa'>

 技巧:懒惰是从前往后匹配的,匹配到了就返回。

 

>>> reg = "ab(.*?)"
>>> re.search(reg,str)
<re.Match object; span=(5, 7), match='ab'>

 这个技巧非常实用,有时候可以用前后夹逼看你的正则是否写错。

2.可供匹配的工具

1.re.match(re,str)成功返回匹配对象否则返回None全部匹配re+$。

2.re.search(re,str)成功返回第一个匹配对象否则返回None。

3.re.findall(re,str))成功返回全部匹配对象并且放到列表里面。

3.开始匹配

3.1子字符串可以直接用于匹配

>>> import re
>>> str = "xiaofeiqiang"
>>> reg = "qiang"
>>> re.search(reg,str)

3.2利用转义字符(如\n,\t)匹配

html文档的转义字符\r\n\t等都可以直接充当表达式进行匹配。

>>> str = "xiao\n fei\n qiang\n"
>>> re.search("\n",str)
<_sre.SRE_Match object; span=(4, 5), match='\n'>

3.3利用通用字符匹配

 

大写与小写通用字符的含义相反。

  • \s:匹配任何空白字符(空格、制表符等等)。
  • \S:不匹配空白字符。
  • \w:匹配下划线和任何单词字符。等价于“[A-Za-z0-9_]”。
  • \W:匹配任何非单词字符。
  • \d:匹配数字即“[0-9]”。
  • \D:匹配不是数字。
>>> str = "xiao\t fei\n qiang\n"
>>> re.findall("\s",str)
['\t', ' ', '\n', ' ', '\n']
>>> re.findall("\w",str)
['x', 'i', 'a', 'o', 'f', 'e', 'i', 'q', 'i', 'a', 'n', 'g']
>>> str = "I have 2feiqiang"
>>> re.search("\dfeiqiang",str) 
<_sre.SRE_Match object; span=(7, 16), match='2feiqiang'>

3.4原子表即“[]”

例如[abc]可以匹配a或b或c。
>>> str = "xiaofeiqiang"
>>> re.search("[fei]",str)
<_sre.SRE_Match object; span=(1, 2), match='i'>#匹配到第一个i即xiao的i

3.5元字符

  1. ^开始位置 $结束位置
  2. .任意字符 *[0,n]次
  3. ?[0,1]次+(0,n]次
  4. {n}匹配出现
  5. n次重复的东西
  6. {n,m}出现[n,m]
  7. |模式选择符()模式单元 
>>> str = "xiaofeiqiang"
>>> reg = "fei|shou"
>>> re.search(reg,str)
<_sre.SRE_Match object; span=(4, 7), match='fei'>
>>> str = "xiaofeiqiang"
>>> reg = "fei|shou"
>>> re.search(reg,str)
<_sre.SRE_Match object; span=(4, 7), match='fei'>

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值