正则表达式

正则表达式通常被用来检索、替换那些匹配某个模式的文本。
正则表达式困难的不是匹配到想要的内容,而是尽可能的不匹配到不想要的内容

概念:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
特点

  1. 灵活性、逻辑性和功能性非常的强;
  2. 可以迅速地用极简单的方式达到字符串的复杂控制。

首先要明白以下几个函数的意思:

  1. re.compile(pattern,flag)根据正则匹配字符串以及附加条件,返回一个pattern对象
  2. re.search(pattern,string)搜索整个字符串,知道发现符合正则表达式的字符串
  3. re.match(pattern,string)从头开始检测字符串是否符合正则表达式,必须从字符串的第一个字符开始
  4. re.findall(pattern,string)根据正则表达式分割字符串,将找到的所有结果放到list中返回
查找字符串:
1
2
3
4
5
6
7
import re
key = r"saas and sas and saaas"
p1 = r"sa{1,3}s"
pattern1 = re.compile(p1)
print(pattern1.findall(key))

p1 = r"sa{1,3}s"表达的意思是a最少重复一次,最多重复三次。

查找邮件地址:
1
2
3
4
5
6
7
8
9
import re
key = r"ben@forta.com " \
r"ben.forta@forta.com " \
r"ben@urgent.forta.com"
p1 = r"\w+[\w.]*@[\w.]+\w+"
pattern1 = re.compile(p1)
print(pattern1.findall(key))
文本匹配:(‘+’和‘*’的贪婪型,‘?’变惰型)
1
2
3
4
5
6
7
import re
key = r"T living in <B>AK</B> and hahaj and <b>HI</b>"
p1 = r"<[Bb]>.+</[Bb]>"
pattern1 = re.compile(p1)
print(pattern1.findall(key))

上面的运行结果是:['<B>AK</B> and hahaj and <b>HI</b>']
为什么呢?因为+是贪婪型的,它会尽可能匹配到更多的字符。
那么解决这一问题就需要在+后面添加一个字符?将贪婪型变为惰型
即为:p1 = r"<[Bb]>.+</[Bb]>"这样就可以获得想要的结果了。

向前向后查找:

假如得到一个网页的HTML源码,其中有一段<html><body><h1>hello world<h1></body></html>想要把hello word提取出来,可这样写:

1
2
3
4
5
6
7
8
import re
key=r"<html><body><h1>hello world<h1></body></html>"#要匹配的文本
p1=r"(?<=<h1>).+?(?=<h1>)"#正则表达式
pattern1=re.compile(p1)#编译这段正则表达式
matcher1=re.search(pattern1,key)#在源文本中搜索符合正则表达式的部分
print(matcher1.group(0))#输出

p1 = r"(?<=<h1>).+?(?=<h1>)"看到(?<=<h1>)(?=<h1>)了吗?第一个?<=表示在被匹配字符前必须得有<h1>,后面的?=表示被匹配字符后必须有<h1>。简单来说,就是你要匹配的字符是XX,但必须满足形式是AXXB这样的字符串,那么你就可以这样写正则表达式
p = r"(?<=A)XX(?=B)"
匹配到的字符串就是XX。并且,向前查找向后查找不需要必须同时出现。如果你愿意,可以只写满足一个条件。
所以你也不需要记住哪个是向前查找,哪个是向后查找。只要记住?<=后面跟着的是前缀要求,?=后面跟的是后缀要求。

回溯引用:
1
2
3
4
5
6
7
8
9
import re
key = r"<H1>welcome</H1>" \
r"and <H2>happy</H3>" \
r"and <H3>wireless</H3>"
p1 = r"<[Hh][1-6]>.*?</[Hh][1-6]>"
pattern1 = re.compile(p1)
print(pattern1.findall(key))

原本要匹配<h1></h1>之间的内容,现在知道HTML有多级标题,想把每一级的标题内容都提取出来:
p1 = r"<[Hh][1-6]>.*?</[Hh][1-6]>"
这样一来,你就可以将HTML页面内所有的标题内容全部匹配出来。
但是,同时也把不符合标题的格式也匹配出来了,例如:
<H2>happy</H3>
如若把后面的[1-6]改为\1或者1,2,3...则能筛选出需要的标题

查找IP地址:
1
2
3
4
5
6
7
import re
key = r"127.0.0.1 and"
p1 = r"(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}" \
r"((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))"
pattern1 = re.compile(p1)
print(re.search(p1,key))

以上都是较常用的例子,看完《正则表达式必知必会》写了以上的内容,很多内容都没有写,以后继续补充。

文章目录
  1. 1. 查找字符串:
  2. 2. 查找邮件地址:
  3. 3. 文本匹配:(‘+’和‘*’的贪婪型,‘?’变惰型)
  4. 4. 向前向后查找:
  5. 5. 回溯引用:
  6. 6. 查找IP地址: