5.正则表达式
5.1 正则表达式的概念与作用
- 概念:正则表达式是一种字符串匹配的模式(pattern);
- 作用:检查一个字符串中是否含有某种子串,替换匹配的字符串,提取某个字符串中匹配的子串;
5.2 正则表达式的常见语法
一般字符 | 匹配自身 | a,b,c… | a,b,c… |
---|---|---|---|
. | 匹配任意除换行符“\n”外的字符 | a.c | abc,acc,ac… |
\ | 转义字符,使后一个字符改变原来的意思 如果字符串中有*需要匹配,可以用* | a\.c a\\c | a.c a\c |
[…] | 字符集,对应的位置可以是字符集中的任意字符。 字符集的内容既可以依次列出,也可以给顶范围, 而第一个字符为^abc表示除abc外的任意字符 字符集中要使用]等字符时,要使用\斜杠 | a[bcd]e | abe ace ade |
预定义字符 | 含义 | 例子 | 匹配实例 |
---|---|---|---|
\d | 数字:[0-9] | a\dc | a1c |
\D | 非数字:[^\d] | a\Dc | abc |
\s | 空白字符:<空格> | a\sc | a c |
\S | 非空白字符 | a\Sc | abc |
\w | 单词字符:[A-Z0-9a-z] | a\wc | abc |
\W | 非单词字符:[^\w] | a\Wc | a c |
数量词 | 含义 | 例子 | 匹配实例 |
---|---|---|---|
* | 匹配前一个字符0或多次 | abc* | ab abccc |
+ | 匹配前一个字符一次或多次 | abc+ | abc abcccc |
? | 匹配前一个字符一次或零次 | abc? | ab abc |
{m} | 匹配前一个字符m次 | ab{2}c | abbc |
5.3 使用实例代码
#导入正则模块
import re
#字符匹配
text = "anabddjajsajdsacdjhadcdjakskabc"
rs = re.findall('abc', text)#普通字符匹配,第一个参数为查找的目标字符串,而第二个参数为查找范围
rs1 = re.findall('a.c', text)#特殊字符的匹配
rs2 = re.findall('a[bc]d', text)#字符集匹配
rs3 = re.findall('a\d*', 'a123')
print(rs)
print(rs1)#返回的是所有的目标的数据
print(rs2)
print(rs3)
5.4 findall方法详解
-
re.findall(pattern, string ,flags=0):
- 作用:扫描整个string字符串,返回与所有pattern匹配的列表;
- 参数:
- pattern:正则表达式;
- string:从哪个字符串中查找;
- flags: 匹配模式(可以通过匹配模式flag=re.DOTALL或re.S,让’.'也能匹配上换行符);
- 返回值:返回与string中与pattern匹配结果相同的所有列表;
-
findall方法中分组功能的使用:
#findall方法中分组的使用 rs4 = re.findall('a.+bc', 'a\nbc', re.DOTALL) rs5 = re.findall('a(.+)bc', 'a\nbc', re.DOTALL)#分组 print(rs4) print(rs5)#仅返回与小括号内容中相同的字符,外部字符仅用于定位,此时返回为“\n”
5.5 正则表达式子中r原串的使用
用于解决写正则的时候,消除转义序列或是不符合PEP8 规范的问题。
#1.不使用r原串时,遇到转义字符如何处理
rs6 = re.findall('a\nbc', 'a\nbc')
rs7 = re.findall('a\\nbc', 'a\\nbc')#此时string中的\n为非转义符
rs8 = re.findall('a\\\\nbc', 'a\\nbc')
print(rs6)#此时可以正常匹配
print(rs7)#此时匹配失败
print(rs8)#此时匹配成功,在正则表达式中要匹配一个转义符需写4个转义符
#2.r原串就是在正则中消除转义符带来的影响
rs9 = re.findall(r'a\\nbc', 'a\\nbc')
print(rs9)#匹配成功
5.6 案例: 提取最新的疫情数据的json字符串
#1.请求疫情数据首页
import requests
from bs4 import BeautifulSoup
response = requests.get("http://ncov.dxy.cn/ncovh5/view/pneumonia")
home_page = response.content.decode()
soup = BeautifulSoup(home_page, 'html.parser')
script = soup.find(attrs={'id': "getListByCountryTypeService2true"})
text = script.string
# print(text)
#2.使用正则表达式提取json字符串
import re
json_str = re.findall(r"\[(.+)\]", text)[0]#由于json字符串返回的是一个列表,我们这里仅需要其第一个元素
print(json_str)