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元字符
- ^开始位置 $结束位置
- .任意字符 *[0,n]次
- ?[0,1]次+(0,n]次
- {n}匹配出现
- n次重复的东西
- {n,m}出现[n,m]
- |模式选择符()模式单元
>>> 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'>