今天我们来聊一下Python中字符的匹配。所谓匹配字符串,即按指定规则提取数据,主要用于爬虫和数据清洗。我们用代码加注释的形式来阐述这一部分内容,为此有必要针对下文做几点说明:
1.下文代码均编写在同一个.py文件中
2.下文中橘黄色标注的为代码,其余为注释
3.为了方便读者阅读,我们将下文涉及的字符匹配的操作罗列如下,读者可根据编号在下述代码中查找相关内容,选择想要阅读的部分:
1.直接字符串匹配 2.任意字匹配 3.范围匹配 4.数字匹配\d 5.非数字匹配
6.字母\w(汉字,字母,数字) 7.非字母\W 8.匹配空格\s 9.匹配非空格\S 10.*匹配
11.+匹配 12.?一次匹配 13.{}按照指定个数或范围进行匹配 14.匹配指定开头和结尾
15.不在范围内匹配 16.获取分组数据匹配 17.指定多个固定的匹配规格
18.给分组数据指定变量名称 19.分组规则的重复使用,获取标签数据
#代码部分
import re
# 使用re.match进行正则的编写和数据提取
# 第一个参数,编写正则表达式,编写数据匹配规则
# 第二个参数,要匹配的字符串数据
# 需要有接受值接收返回结果
# 1.直接字符串匹配
r = re.match('ti', 'it')
try:
data = r.group()
except:
print('未匹配到数据')
else:
print(data)
# 从结果中获取匹配的数据 r.group() ,可以定义变量接收数据,未匹配到数据则报错
# 注意:正则的匹配顺序是从第一个字符开始匹配,
# 如果第一个字符未匹配,则报错('t' != 'i'),
# 直接字符串匹配时,根据第一个参数的全部内容进行匹配,即从如果匹配成功,匹配的结果就是第一个参数
# 2.任意字匹配
r = re.match('....', '北京.D')
data = r.group()
print(data)
结果为 北京.D
# 3.范围匹配
r = re.match('[ads]', 'dhamsn')
data = r.group()
print(data)
# 结果为d,说明是将参数二中的字符拿来一一匹配
r = re.match('[ads][dhs][had]', 'dhamsn')
data = r.group()
print(data)
# 结果为dha
r = re.match('[a-z0-9A-Z][a-z0-9A-Z][a-z0-9A-Z]', 'sF0qg')
data = r.group()
print(data)
# 结果为sF0
# 4.数字匹配\d
r = re.match('\d\d', '89ih')
data = r.group()
print(data)
# 结果为68
# 5.非数字匹配
r = re.match('\D', 'h#j')
data = r.group()
print(data)
# 6.字母\w(汉字,字母,数字)
r = re.match('\w', '天di')
data = r.type()
print(data)
# 7.非字母\W
r = re.match('\W', '$10')
data = r.group()
print(data)
# 8.匹配空格\s
r = re.match('\s', ' as')
data = r.group()
print(data)
# 9.匹配非空格\S
r = re.match('\S', '&Gg2')
data = r.group()
print(data)
#多字符匹配
# 10.*匹配,可以匹配0至多个字符,若匹配0个,则返回空
r = re.match('\d*', 'yeasterday')
data = r.group()
print(data)
# 返回为空,不会报错
r = re.match('\w*', 'fda677sa##$')
data = r.group()
print(data)
# 结果为fda677sa
# '.*'全匹配
# 11.+可以匹配一个或多个,若匹配不到会报错
r = re.match('\d+', 'gerg46')
data = r.group()
print(data)
# 12.?进行一次匹配,匹配失败返回空值
r = re.match('\d?', 'asd7')
data = r.group()
print(data)
# 13.{}按照指定个数或范围进行匹配({m,n}匹配m到n位)
r = re.match('\w{2}', 'gerg46')
data = r.group()
print(data)
# 结果为ge
r = re.match('\w{2,4}', 'ger$g46')
data = r.group()
print(data)
# 结果为ger
# 14.匹配指定开头和结尾
# ^匹配开头
r = re.match('^\w+', 'ger$g46')
data = r.group()
print(data)
# 结果为ger
# $匹配结尾
r = re.match('\w+\W+$', 'ger$@')
data = r.group()
print(data)
# 结果为ger$@
# 15.不在范围内匹配
r = re.match('[^iknh]', 'ger$g46')
data = r.group()
print(data)
# 结果为g
# 16.获取分组数据,将数据拆分为多个部分,分别取出对应的值
# 邮箱匹配,用户名@服务名.com,分别取出用户名,服务名
r = re.match('(\w+)@(\w+).com','[email protected]')
data = r.group(2)
print(data)
# 结果为qq,可见分组可以取出match方法内层括号里的内容,
# group(0)会取出包括内层括号外的所有内容,即[email protected]
# 17.指定多个固定的匹配规格
r = re.match('(\w+)@(163|qq|sina|google).com', '[email protected]')
data = r.group(2)
print(data)
# (163|qq|sina|google|hrbeu)指定了匹配的规格,不在此规格内则报错
# 18.给分组数据指定变量名称?P<变量名>
r=re.match('(?P
data = r.group('user_name')
print(data)
# 运行结果my.
# 19.分组规则的重复使用,取标签数据
# r = re.match('<(.+)>.*<(/\\1)>', 'tryagain')
r = re.match('<(?P
data = r.group()
print(data)
# 运行结果为 tryagain