正则表达式初步

正则表达式

原子

正则表达式最基础的组成单位,每个正则表达式至少包含一个原子。常见的原子类型有:

  • 普通字符
  • 非打印字符(换行符\n, tab\t)
  • 通用字符(\w用来匹配任意的一个字母数组下划线,\d用来匹配任意一个十进制数,\s用来匹配任意一个空白字符,\W用来匹配与\w互补的字符,\D\S也同样是\d\s取非)
  • 原子表(定义一组平等的原子,例如[jst],在应用的时候可以像pattern = 'pyth[jst]n'一样使用)

re.search(规则,对象)是从内容中按照规定的规则搜索内容的函数。

元字符

正则表达式中具有一些特殊含义的字符。

  1. .:用来匹配任意一个字符
  2. ^:用来匹配字符串开始的位置,另如[^]这样的括号中的^表示的是取非运算
  3. $:用来匹配字符串结束的位置
  4. *:用来匹配零次一次以及多次其之前的原子,例如's*'
  5. ?:用来匹配零次或者一次其之前的原子,例如's?'
  6. +:用来匹配一次或者多次其之前的原子,例如's+'
  7. {3}:前面的原子恰好出现3次,例如't{3}',如果打括号内有逗号,例如't{3,}',则表示前面的原子至少出现了3次。如果是't{3,7}'则表示至少出现3次,至多出现7次
  8. |:模式选择符或
  9. ():(组合),匹配括号内的任意正则表达式,并标识出组合的开始和结尾。匹配完成后,组合的内容可以被获取

模式修正符

模式修正符,即可以在补发彼岸正则表达式的情况下,通过模式修正符改变正则表达式的含义,从而实现一些匹配结果的调整等功能。

  1. re.I:忽略大小写
  2. re.M:多行匹配
  3. re.L:本地化识别匹配
  4. re.U:根据Unicode字符解析
  5. re.S:使.也能够匹配换行符

贪婪模式和懒惰模式

贪婪模式的核心是尽可能多的去匹配,懒惰模式的核心则是尽可能少的去匹配。

例如贪婪模式有pat1 = 'p.*y' #greedy,而懒惰模式则为pat2 = 'p.*?y' #lazzy

正则表达式函数

正则表达式函数有re.match()函数,re.search()函数,re.fullmatch()函数和re.sub()函数等等。

re.search():扫描整个字符串找到匹配样式的第一个位置,并返回一个相应的匹配。如果没有匹配,就返回一个 None

re.match():如果 string 开始的0或者多个字符匹配到了正则表达式样式,就返回一个相应的匹配对象。如果没有匹配,就返回一个 None

re.fullmatch():如果整个 string 匹配到正则表达式样式,就返回一个相应的匹配对象。如果没有匹配,就返回一个 None。使用的时候例如re.compile(pattern).findall()

利用正则表达式的爬虫小例子

1
2
3
4
5
6
7
8
9
10
import re
import urllib.request

pattern = '<div class="cm-body"><div class="name">(.*?)</div><div class="works-num">'
data = urllib.request.urlopen('https://read.douban.com/provider/all').read()
data = data.decode('utf-8')
mydata = re.compile(pattern).findall(data)
fp = open('publisher.txt', 'w')
for item in mydata:
fp.write(item+'\n')

这个例子可以将网站中的所有出版社爬下来并保存到文件中。正则表达式中.*?的作用是使用懒惰模式来匹配任意字符。