先引入一下百度百科对于正则表达式的概念:
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
然后我们来引入一下贪婪算法与非贪婪算法的一个概念:
贪婪算法:
贪婪匹配(默认的):在整个表达式匹配成功的前提下,尽可能多的匹配
表达方式: .* .+ .? ·······
非贪婪算法:
贪婪匹配:在整个表达式匹配成功的前提下,尽可能少的匹配
表达方式: .* ? .+? .?? ·······
当然我们通过代码也可以看出来
import re html = """ <html> <div><p>九霄龙吟惊天变</p></div> <div><p>风云际会浅水游</p></div> </html> """ #贪婪匹配 pattern = re.compile('<div><p>.*</p></div>',re.S) #表达式为: .* r_list = pattern.findall(html) print(r_list) #非贪婪匹配 pattern = re.compile('<div><p>.*?</p></div>',re.S) #表达式为: .*? r_list = pattern.findall(html) print(r_list)
我们可以通过输出结果看出来两者的区别
['<div><p>九霄龙吟惊天变</p></div>\n <div><p>风云际会浅水游</p></div>'] #将 \n换行 空格 全部匹配了下来
['<div><p>九霄龙吟惊天变</p></div>', '<div><p>风云际会浅水游</p></div>'] #只是将 两个div中的内容匹配了下来
可以看出 贪婪算法会在字符串中会找到第一个匹配的元素后就会一直寻找到最后一个匹配的元素 即使中间有重复匹配的元素的元素
非贪婪算法会尽可能的少匹配,即为只要满足就会结束,从而寻找下一组匹配的元素
正则算法子模式的应用
如上代码 如果我想要将 九霄龙吟惊天变 风云际会浅水游 这两句诗单独提取出来 就要单独修改代码
pattern = re.compile('<div><p>(.*?)</p></div>',re.S) #表达式为: (.*?) r_list = pattern.findall(html) print(r_list)
即为:在需要单独提取出来的元素两边加上() 运行结果为:
['九霄龙吟惊天变', '风云际会浅水游']
下面我们可以进行一些其他的测试 从而更加直观的看到 正则表达式子模式的应用
\w:单次或多次出现的字符 \s:空白字符
s = 'A B C D' p1 = re.compile('\w+\s+\w+') print(p1.findall(s))
结果为:
['A B','C D']
s = 'A B C D' p1 = re.compile('(\w)+\s+\w+') print(p1.findall(s))
结果为:
['A','C']
s = 'A B C D' p1 = re.compile('(\w)+\s+(\w+)') print(p1.findall(s))
结果为:
[('A','B'),('C','D')]
仅供学习! 2019.10.8