Table of Contents
Python正则表达式
导入 re 包
import re
str = "This is a demo.我爱北京天安门, 天安门前太阳升, 这是1段示例文字. I love Beijing Tian\'anmen Square. The Sun rise in front of it. This is a demo 11.11 ."
匹配第一次出现的字符
mat = 'i'
res = re.search(mat,str)
print(res.span()) # (37.38)
匹配所有位置的字符
mat = 'i'
res = re.finditer(mat,str)
for it in res:
print(it.span())
匹配所有数字
mat = r'\d+' # \d 匹配数字 + 一次或者多次
res = re.findall(mat,str)
print(res)
mat = r'\d+\.?\d*' # ? 表示前一个字符重复一次或者零次
res = re.findall(mat,str)
print(res)
匹配开头字符
mat = r'^[thank]'
res = re.findall(mat,str)
print(res)
忽略大小写
mat = r'^[thank]'
res = re.compile(mat,re.I).search(str)
print(res.span())
留下单词去掉空格
version one
mat = r'\s?([a-zA-Z]+)'
res = re.findall(mat,str)
print(res)
version two
mat = r'\s+'
res = re.split(mat,str)
print(res)
查找满足某些条件的单词
mat = r'(^([TtIi][a-zA-Z]*))\s'
res = re.compile(mat,re.I).findall(str)
print(res)
mat = r'\s+'
res = re.split(mat,str)
res = [i for i in res if re.match(r'[TtIi]', i)]
print(res)
贪心匹配
mat = r'[Tt]his(.*)demo'
mat = r'[Tt]his(.*?)demo'
pat = re.compile(mat)
mes = pat.findall(str)
print(mes)
多个分隔符
mat = r'[\.\,\;]+'
pat = re.compile(mat)
mes = pat.split(str)
print(mes)
替换字符串
mat = r'\d+'
pat = re.compile(mat)
mes = pat.sub("2020-01-01",str)
print(mes)
中文匹配
mat = r'[\u4e00-\u9fa5]+'
res = re.findall(mat,str)
print(res)
总结1
. 任意字符<br>
^ 起始位置<br>
$ 结束位置<br>
\* 零次以上<br>
\+ 一次以上<br>
? 前面一次或者零次<br>
{n} 前面重复n次<br>
{n,} 前面至少重复n次<br>
{n,m} 前面重复n到m次<br>
() 分组输出
和Elisp不同的是, ?表示匹配前面的字符, python匹配后面的字符, 另外Elisp使用C编译, 转义符需要打两个
总结2
\s 匹配空白字符<br>
\w 任意字符/下划线/数字<br>
\W 除\w以外的字符<br>
\d 十进制数字<br>
\D 除十进制以外的值<br>
[0-9] 0-9数字<br>
[a-z] 全部小写字母<br>
[A-Z] 全部大写字母
示例 爬取 BMJChina 标题
import re
from urllib import request
url = 'http://bmjchina.com.cn/journals/'
data = request.urlopen(url).read().decode()
mat = r'<title>(.*?)</title>'
res = re.search(mat,data)
print(res)
res.group()