正则表达式是用来匹配与查找字符串的,从网上爬取数据自然或多或少会用到正则表达式。
Python 的正则表达式要先引入 re 模块,正则表达式以 r 引导,例如:
import re
reg=r"\d+"
m=re.search(reg,"abc123cd")
print(m)
其中 r"\d+"正则表达式表示匹配连续的多个数值,search 是 re 中的函数,从"abc123cd" 字符串中搜索连续的数值,得到"123",返回一个匹配对象,因此程序的结果如下: 从结果看出,在指定的字符串中找到了连续的数值,它们是"123",span(3,6)表示开始 位置是 3,结束位置是 6,这正好是"123"在"abc123cd"中的位置。
Python 中关于正则表达式的规则比较多,下面将介绍主要的内容,详细内容读者可以 参考相关资料。
import re
reg=r"\d"
m=re.search(reg,"abc123cd")
print(m) 结果找到了第一个数值"1":
import re
reg=r"b\d+"
m=re.search(reg,"a12b123c")
print(m)
结果找到了"b123":
注意:r"b\d+"第一个字符要匹配"b",后面是连续的多个数字,因此是"b123",不是"a12"。
import re
reg=r"ab+"
m=re.search(reg,"acabc")
print(m)
reg=r"ab*"
m=re.search(reg,"acabc")
print(m)
结果: 由此可见 r"ab+"匹配的是"ab",但是 r"ab*"匹配的是"a",因为 r"ab*"表示"b"可以重复 零次,但是"+"却要求"b"重复一次以上。
import re
reg=r"ab?"
m=re.search(reg,"abbcabc")
print(m)
结果: 匹配结果是"ab",其中 b 重复一次。
import re
s="xaxby"
m=re.search(r"a.b",s)
print(m)
结果"."代表了字符"x"
import re
s="xaabababy"
m=re.search(r"ab|ba",s)
print(m)
结果匹配"ab"或者"ba"都可以:
import re
reg=r"a\nb?"
m=re.search(reg,"ca\nbcabc")
print(m) 结果匹配"a\n\b":
import re
reg=r"car\b"
m=re.search(reg,"The car is black")
print(m) 结果匹配"car",因为"car"后面是以个空格:
import re
reg=r"x[0-9]y"
m=re.search(reg,"xyx2y")
print(m) 结果匹配"x2y":
import re
reg=r"x[^ab0-9]y"
m=re.search(reg,"xayx2yxcy")
print(m) 结果匹配"xcy":
import re
s="1a ba\tbxy"
m=re.search(r"a\sb",s)
print(m) 结果匹配"a b":
import re
reg=r"\w+"
m=re.search(reg,"Python is easy")
print(m) 结果匹配"Python":
import re
reg=r"^ab"
m=re.search(reg,"cabcab")
print(m) 结果: None 没有匹配到任何字符,因为"cabcab"中虽然有"ab",但不是"ab"开头。
import re
reg=r"ab$"
m=re.search(reg,"abcab")
print(m)
匹配结果是最后一个"ab",而不是第一个"ab":
import re
reg=r"(ab)+"
m=re.search(reg,"ababcab")
print(m) 结果匹配"abab","+"对"ab"进行了重复:
正则表达式库 re 的 search 函数使用正则表达式对要匹配的字符串进行匹配,如果匹配 不成功就返回 None,如果匹配成功就返回一个匹配对象。
匹配对象调用 start()函数得到匹 配字符串的开始位置,匹配对象调用 end()函数得到匹配字符串的结束位置。
search 虽然只 返回第一次匹配的结果,但是我们只要连续使用 search 函数就可以找到字符串中全部匹配 的字符串。 例:
匹配找出英文句子中所有单词 我们可以使用正则表达式 r"[A-Za-z]+\b"匹配单词,它表示匹配由大小写字母组成的连续 多个字符,一般是一个单词,之后"\b"表示单词结尾。
import re
s="I am testing search function"
reg=r"[A-Za-z]+\b"
m=re.search(reg,s)
while m!=None:
start=m.start()
end=m.end()
print(s[start:end])
s=s[end:]
m=re.search(reg,s)
结果: I am testing search function 程序开始匹配到一个单词后 m.start(),m.end()就是单词的起始位置,s[start:end]为截取的单词, 之后程序再次匹配字符串 s=s[end:],即字符串的后半段,一直到匹配完毕为止就找出每个单词
中国MOOC爬虫技术