Python正则表达式

正则表达式

Posted by Chopong on January 2, 2020

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()