正则表达式通常被用来检索、替换那些匹配某个模式的文本。正则表达式困难的不是匹配到想要的内容,而是尽可能的不匹配到不想要的内容
概念:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
特点:
- 灵活性、逻辑性和功能性非常的强;
- 可以迅速地用极简单的方式达到字符串的复杂控制。
首先要明白以下几个函数的意思:
re.compile(pattern,flag)根据正则匹配字符串以及附加条件,返回一个pattern对象re.search(pattern,string)搜索整个字符串,知道发现符合正则表达式的字符串re.match(pattern,string)从头开始检测字符串是否符合正则表达式,必须从字符串的第一个字符开始re.findall(pattern,string)根据正则表达式分割字符串,将找到的所有结果放到list中返回
查找字符串:
|
|
p1 = r"sa{1,3}s"表达的意思是a最少重复一次,最多重复三次。
查找邮件地址:
|
|
文本匹配:(‘+’和‘*’的贪婪型,‘?’变惰型)
|
|
上面的运行结果是:['<B>AK</B> and hahaj and <b>HI</b>']
为什么呢?因为+是贪婪型的,它会尽可能匹配到更多的字符。
那么解决这一问题就需要在+后面添加一个字符?将贪婪型变为惰型
即为:p1 = r"<[Bb]>.+</[Bb]>"这样就可以获得想要的结果了。
向前向后查找:
假如得到一个网页的HTML源码,其中有一段<html><body><h1>hello world<h1></body></html>想要把hello word提取出来,可这样写:
p1 = r"(?<=<h1>).+?(?=<h1>)"看到(?<=<h1>)和 (?=<h1>)了吗?第一个?<=表示在被匹配字符前必须得有<h1>,后面的?=表示被匹配字符后必须有<h1>。简单来说,就是你要匹配的字符是XX,但必须满足形式是AXXB这样的字符串,那么你就可以这样写正则表达式p = r"(?<=A)XX(?=B)"
匹配到的字符串就是XX。并且,向前查找向后查找不需要必须同时出现。如果你愿意,可以只写满足一个条件。
所以你也不需要记住哪个是向前查找,哪个是向后查找。只要记住?<=后面跟着的是前缀要求,?=后面跟的是后缀要求。
回溯引用:
|
|
原本要匹配<h1></h1>之间的内容,现在知道HTML有多级标题,想把每一级的标题内容都提取出来:p1 = r"<[Hh][1-6]>.*?</[Hh][1-6]>"
这样一来,你就可以将HTML页面内所有的标题内容全部匹配出来。
但是,同时也把不符合标题的格式也匹配出来了,例如:<H2>happy</H3>
如若把后面的[1-6]改为\1或者1,2,3...则能筛选出需要的标题
查找IP地址:
|
|
以上都是较常用的例子,看完《正则表达式必知必会》写了以上的内容,很多内容都没有写,以后继续补充。