【实用技能分享】Python正则表达式详解

说在前面
正则表达式是一个很强大的字符串处理工具,几乎任何关于字符串的操作都可以使用正则表达式来完成,作为一个爬虫工作者,每天和字符串打交道,正则表达式更是不可或缺的技能。

正则表达式在不同的语言中使用方式不尽相同,不过只要学会了任意一门语言的正则表达式用法,其他语言中大部分也只是换了个函数的名称而已,本质都是一样的。

原子
原子是正则表达式中最基本的单位,每个正则表达式中至少要包含一个原子。常见的原子类型:

普通字符作为原子
非打印字符作为原子
通用字符作为原子
原子表

普通字符作为原子

演示代码:
import re#引用re
string = “shentouyun”#定义整段,普通字符作为原子

pat = “yun”#提取yun
ret = re.search(pat,string)#第一个参数为提取,第二个为整个字段
print(ret)#输出
输出
<_sre.SRE_Match object; span=(7, 10), match=‘yun’>

非打印字符作为原子

什么是非打印字符,如\n,\t(换行,制表),代表一些操作的字符也可以作为原子

操作代码与小知识
string1 = ‘’‘shentouyun
nuibi
‘’’
pat1 = ‘\n’

ret=re.search(pat1,string1)
print(ret)
运行后
<_sre.SRE_Match object; span=(10, 11), match=’\n’>
小知识
#在这里解释一个基础,我没有提到过
string = ‘’’
shentouyun
nuibi
‘’’
print(string)
#这段代码里,其特点为string被三引号包裹,并在代码里实现换行其运行结果
shentouyun
nuibi
#实现了一个\n的操作其代码等同于
string =“shentouyun\nnuibi”
print(string)
通用字符作为原子

什么是通用字符?

  1. \w匹配任意一个字母数字或下划线;

  2. \W匹配除去字母数字或下划线任意一个字符;

  3. \d匹配十进制数;

  4. \D除十进制以外的任意一个字符;

  5. \s匹配一个空白字符;

  6. \S除去空白字符。

简单的例子
string1 = “shentouyun3215454biji”

pat1 = ‘\d\d\d\d’#匹配四个十进制数

ret=re.search(pat1,string1)
print(ret)
运行后
<_sre.SRE_Match object; span=(10, 14), match=‘3215’>
也可以混合使用
string1 = “shentouyun3215454biji”
pat1 = ‘\w\d\d\d\d’#匹配一个字母+匹配四个十进制数
ret=re.search(pat1,string1)
print(ret)
运行后
<_sre.SRE_Match object; span=(9, 14), match=‘n3215’>
没有符合格式的,如空白就不会匹配出来,这里不过多的描述,占用空间。

原子表
[ots]任意的提取一个原子出来,直接任意选择一个原子表原子,如下:
string1 = “shentouyun3215454biji”
pat1 = “shen[otoasdjojds]ou”
ret=re.search(pat1,string1)
print(ret)
运行后
<_sre.SRE_Match object; span=(0, 7), match=‘shentou’>
只从原子表中选择一个原子,其原子表内原子地位平等。

非原子表
符号^ 英文状态下的shift+6

字符串里出现了非原子表,返回None,其代码如下:
string1 = “shentouyun3215454biji”

pat1 = “shen[^tun]ou”
#shen后面应该是匹配t结果原子表里出了[tun]三个原子外其他的原子都可以匹配
#显然本代码中的原子是无法匹配的
ret=re.search(pat1,string1)
print(ret)
返回如下:
None
如果正常运行非原子表外的字符如string1字符串中截取的shen后面是t,在非原子表上,没有出现t,则返回shent。
string1 = “shentouyun3215454biji”
pat1 = “shen[^asd]”
#为了更加直白我把ou两个字符去掉了
ret=re.search(pat1,string1)
print(ret)
运行后
<_sre.SRE_Match object; span=(0, 5), match=‘shent’>

元字符
特殊含义的字符

所谓的元字符,就是正则表达式中具有一些特殊含义的字符,比如重复N多次前面的字符。

"."除换行外任意一个字符

代码如下:
string1 = “shentouyun3215454biji”
pat1 = “shen.ou”#这里.匹配除了换行符外的任意字符
ret=re.search(pat1,string1)
print(ret)
运行结果
<_sre.SRE_Match object; span=(0, 7), match=‘shentou’>
当然你也可以多匹配些,比如多些点点。
string1 = “shentouyun3215454biji”
pat1 = “shen…”
ret=re.search(pat1,string1)
print(ret)
运行后
<_sre.SRE_Match object; span=(0, 10), match=‘shentouyun’>
开始位置^与结束位置$
string1 = “shentouyun3215454biji”
pat1 = “^s…”
ret=re.search(pat1,string1)
print(ret)
运行后
<_sre.SRE_Match object; span=(0, 4), match=‘shen’>
因为s是开始,也就是“排头”结束位置也同理。
string1 = “shentouyun3215454biji”
pat1 = “b…$”
ret=re.search(pat1,string1)
print(ret)
运行后
<_sre.SRE_Match object; span=(17, 21), match=‘biji’>
""0次1次多次*
string1 = “shentouyun3215454biji”
pat1 = “shen."
ret=re.search(pat1,string1)
print(ret)
运行后
<_sre.SRE_Match object; span=(0, 21), match=‘shentouyun3215454biji’>
为什么会全匹配,看
号的定义为多次,咱们的”."表示除了换行外全匹配,两者一配合。

+号与?号

+匹配多次,正常显示无法匹配0次,演示错误例子。
string1 = “shentouyun3215454biji”
pat1 = “a+”
ret=re.search(pat1,string1)
print(ret)

None
演示正确例子
string1 = “aaaaaaaaaaaa”
pat1 = “a+”
ret=re.search(pat1,string1)
print(ret)

<_sre.SRE_Match object; span=(0, 12), match=‘aaaaaaaaaaaa’>
问号就更好弄了

问号直接演示错误例子,无法显示多次
string1 = “aaaafsedfsfdffasafadaaaaaaaa”
pat1 = “a?”
ret=re.search(pat1,string1)
print(ret)

<_sre.SRE_Match object; span=(0, 1), match=‘a’>
{n}与{n,}
string1 = “aaaa”
pat1 = “a{4}”
ret=re.search(pat1,string1)
print(ret)

<_sre.SRE_Match object; span=(0, 4), match=‘aaaa’>
如果换成3呢
<_sre.SRE_Match object; span=(0, 3), match=‘aaa’>
打印了三次,成功演示了什么叫做至少,当然你多了不行,改成5试试。
None
{n,m}至少多少次,至多多少次
string1 = “aaaa”
pat1 = “a{3,5}”
ret=re.search(pat1,string1)
print(ret)

<_sre.SRE_Match object; span=(0, 4), match=‘aaaa’>

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

模式修正符有什么?

I忽略大小写

M多行匹配

L本地化识别匹配

U unicode编码

S让,匹配包括换行符

错误代码演示
string = “ShenTouYun”
pat=“shen”
ret = re.search(pat,string)
print(ret)
返回None,因为默认有大小写限制,引用一下I就可以了。
string = “ShenTouYun”
pat=“shen”
ret = re.search(pat,string,re.I)
print(ret)
运行结果
<_sre.SRE_Match object; span=(0, 4), match=‘Shen’>

贪婪模式与懒惰模式

贪婪模式的核心点就是尽可能多的匹配

懒惰模式的核心就是尽可能少的匹配

贪婪模式
string = “SheSnTouYunYS”
pat=“s.*S”
ret = re.search(pat,string,re.I)
print(ret)
运行结果
<_sre.SRE_Match object; span=(0, 13), match=‘SheSnTouYunYS’>
贪婪模式与懒惰模式有什么用呢?

看对比
string = “SheSnTouYunYS”
pat=“s.S"#贪婪模式找到最后一个s
pat1="s.
?S”#懒惰模式,特征为?,找到第一个s就不往下找了
ret = re.search(pat,string,re.I)
ret1 = re.search(pat1,string,re.I)
print(ret)
print(ret1)
运行结果
<_sre.SRE_Match object; span=(0, 13), match=‘SheSnTouYunYS’>
<_sre.SRE_Match object; span=(0, 4), match=‘SheS’>

正则表达式函数

1、re.match( )函数从头开始匹配

2、re.search( )函数从任何地方开始匹配

3、全局匹配函数

match函数演示
string1 = “a**fewfaaa”
pat1 = “a”
ret=re.match(pat1,string1)
print(ret)

运行结果可匹配
<_sre.SRE_Match object; span=(0, 1), match=‘a’>
不是第一个开始匹配
string1 = “a**fewfaaa”
pat1 = “d”
ret=re.match(pat1,string1)
print(ret)

运行结果不可匹配
None
全局匹配函数

全局匹配格式
re.compile(正则表达式).findall(数据)
string1 = “a**fewfaaa”
pat1 = “d.*?a”
ret=re.compile(pat1).findall(string1)
print(ret)
结果
[‘da’]
在码文中的一些杂乱代码
import re#引用re
‘’’
string = “shentouyun”#定义整段,普通字符作为原子

pat = “yun”#提取yun
ret = re.search(pat,string)#第一个参数为提取,第二个为整个字段
print(ret)#输出

match
sub
search
全局匹配

string = “SheSnTouYunYS”
pat=“s.S"#贪婪模式找到最后一个s
pat1="s.
?S”#懒惰模式,特征为?,找到一个y就不往下找了
ret = re.search(pat,string,re.I)
ret1 = re.search(pat1,string,re.I)
print(ret)
print(ret1)
‘’’
首先预热下,爬取豆瓣首页

导入urllib库下的request
import urllib.request
使用下urlopen打开网站返回HTML
urllib.request.urlopen
读一下看看拿到了什么东西,使用read( ),并给douban保存方便再GUI里调用
douban = urllib.request.urlopen.read()
可以独立尝试,会非常卡。简单点是用len看字节
len(douban)
105653
爬取豆瓣评论

导入正则模块(re)
import re
写了个例子
#豆瓣评论爬取小例子
import urllib.request
import re
douban = urllib.request.urlopen.read().decode(“UTF-8”)
pat = ‘.*?
rst = re.compile(pat).findall(douban)
print(rst[0])
引用decode(“UTF-8”)对其解码为utf-8

正则为
(.*?)
如何写正则与本例的细节

发现评论格式为
就是山西版本的《两杆大烟枪》或者说《疯狂的石头》,将山西风光和特色与影片融合的很好,虽然还是有所瑕疵,也难逃一些俗套烂大街的剧情和段子,但是还可以。
所有评论被标签包裹,可以进行抓取,使用懒惰模式进行操作。
.*?
"."全匹配,其细节为标签里有双引号,我们再写正则时使用单引号括起来,不要再使用双引号了。

写循环把东西都显示出来
for i in range(0,len(rst)):
print(rst[i])
运行为

[‘一直很喜欢这种结构的电影,一圈圈地放出线团,再一段段收回,圆融又宿命。以山西籍为主的演员都挺走心的,生活的鸡飞狗走很是活灵活现,而且骆达华的出场太惊喜。导演说是改编太贵,索性自己写。但要是看过《提着心吊着胆》,会发现许多元素重合度很高,比如生意惨淡的饭店、存在问题的夫妇、警察、笨贼、拜金女、装大款……就连意外之财也是丢在饭店里。 江苏小学辅导电影结尾顾虑较多,但整体完成度与幽默感不差。@平遥,特意买票支持,却来…’, ‘算是一部跟期待打平的作品吧,中规中矩,没有惊艳,王大治倒是真有那么几分长相之外的亮点。故事一圈圈闪回,重复的部分有点多,生怕观众跟不上这个倒叙+插叙的节奏似的。四川话河南话陕西话山西话一锅烩,泱泱大中华式的热闹。想要揭示人心叵测,但终归是浅了一点。【平遥电影节2018.10.19’, ‘这种结构挺好’, ‘审美疲劳,这种太多了,都大同小异。从每组人物的角度,反复讲同一个事。国产电影里的歹徒劫匪都是来搞笑的,都是**,呵呵。’, ‘巧就巧在结构上。’]
一直很喜欢这种结构的电影,一圈圈地放出线团,再一段段收回,圆融又宿命。以山西籍为主的演员都挺走心的,生活的鸡飞狗走很是活灵活现,而且骆达华的出场太惊喜。导演说是改编太贵,索性自己写。但要是看过《提着心吊着胆》,会发现许多元素重合度很高,比如生意惨淡的饭店、存在问题的夫妇、警察、笨贼、拜金女、装大款……就连意外之财也是丢在饭店里。电影结尾顾虑较多,但整体完成度与幽默感不差。@平遥,特意买票支持,却来…
算是一部跟期待打平的作品吧,中规中矩,没有惊艳,王大治倒是真有那么几分长相之外的亮点。故事一圈圈闪回,重复的部分有点多,生怕观众跟不上这个倒叙+插叙的节奏似的。四川话河南话陕西话山西话一锅烩,泱泱大中华式的热闹。想要揭示人心叵测,但终归是浅了一点。【平遥电影节2018.10.19
这种结构挺好
审美疲劳,这种太多了,都大同小异。从每组人物的角度,反复讲同一个事。国产电影里的歹徒劫匪都是来搞笑的,都是**,呵呵。
巧就巧在结构上。

保存到本地
fh = open(“G:\python\doubanpinglun.txt”,“w”)#打开文件并新建doubanpinglun.txt
open里的路径为本地路径

完整代码如下:
#豆瓣评论爬取小例子
import urllib.request
import re
douban = urllib.request.urlopen.read().decode(“UTF-8”)
pat = ‘(.*?)
rst = re.compile(pat).findall(douban)
print(rst)
fh = open(“G:\python\doubanpinglun.txt”,“w”)#打开文件并新建doubanpinglun.txt
for i in range(0,len(rst)):
print(rst[i])
fh.write(rst[i]+"\n")#写入文件
fh.close()#关闭文件
以上就是今天分享的内容,大家学会了吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,我可以回答你关于Python正则表达式的问题。 Python正则表达式是一种用来匹配和处理字符串的工具。它可以在字符串中搜索和匹配特定的模式,以实现更高效和精确的数据处理。Python的re模块提供了完整的正则表达式支持,并且非常强大和灵活。 使用Python正则表达式,你可以实现各种字符串操作,比如搜索、替换、分割、提取等等。它的语法相对简单,但是功能非常强大,可以满足大部分的字符串处理需求。 在使用Python正则表达式时,你需要掌握一些基本的语法规则,比如元字符、字符集、重复、分组等等。这些语法规则可以组合在一起,形成复杂的匹配模式,以实现更加精细的字符串处理。 总之,Python正则表达式是一种非常有用的工具,可以大大提高字符串处理的效率和精确度。如果你想深入了解它的用法和技巧,可以查看Python官方文档中关于re模块的详细说明。 ### 回答2: Python正则表达式是一种强大的文本匹配和处理工具,通过使用特定的模式来识别和操作文本中的字符串。正则表达式通常被用于从文本中提取特定的信息、验证输入的有效性、进行替换或搜索等操作。 Python正则表达式的语法使用元字符和特殊字符来定义搜索模式,其中元字符用于描述字符类型或位置,特殊字符用于描述重复次数或匹配方式。常见的元字符包括"."(匹配任意字符)、"\d"(匹配数字字符)、"\w"(匹配字母、数字或下划线字符)、"\s"(匹配空白字符)等。特殊字符包括"*"(匹配前面的模式0次或多次)、"+"(匹配前面的模式1次或多次)、"?"(匹配前面的模式0次或1次),以及花括号{}(指定前面模式的重复次数)等。 使用Python正则表达式时,常见的操作包括匹配、搜索、替换和分割。匹配操作通过`re.match()`或`re.search()`函数实现,用于从字符串的起始位置或任意位置开始匹配;搜索操作通过`re.findall()`或`re.finditer()`函数实现,用于在整个字符串中搜索匹配的内容;替换操作通过`re.sub()`函数实现,用于替换匹配到的内容;分割操作通过`re.split()`函数实现,用于按指定的模式分割字符串。 Python正则表达式还支持分组、捕获、非捕获、反向引用等高级特性,可通过使用括号`()`进行分组,并使用`\number`的方式引用分组匹配到的内容。 总而言之,Python正则表达式提供了一套强大且灵活的工具来处理文本匹配和处理的需求。学习和熟练掌握正则表达式的使用,对于处理和分析文本数据将大有裨益。 ### 回答3: Python正则表达式是一种用来匹配字符串模式的工具。它使用一种特殊的语法来描述字符串的模式,然后通过与给定的字符串进行比较,判断是否匹配。 在Python中,我们使用re模块来使用正则表达式。首先,我们需要导入re模块,然后使用re模块提供的函数来进行匹配操作。 正则表达式中的一些基本概念包括: 1. 字符组:用方括号[]表示,表示匹配其中的任意一个字符。例如[abc]表示匹配字符a、b或c。 2. 量词:用来表示匹配多个字符的数量。例如*表示匹配0个或多个字符,+表示匹配1个或多个字符,?表示匹配0个或1个字符。 3. 元字符:具有特殊含义的字符,例如.表示匹配除换行符外的任意字符,\d表示匹配任意一个数字字符。 4. 转义字符:使用反斜杠\来转义元字符。例如\.表示匹配点字符。 5. 边界匹配:^表示匹配字符串的开头,$表示匹配字符串的结尾。 可以通过这些基本概念进行复杂模式的匹配。例如,使用re模块的match函数可以判断一个字符串是否以某个模式开头,使用search函数可以在字符串中搜索匹配某个模式的子串,使用findall函数可以找到所有匹配的子串。 除了基本概念外,Python正则表达式还提供了一些更高级的功能,例如分组、捕获和替换等。 总之,Python正则表达式是一种强大的工具,可以用于字符串的匹配和处理。掌握正则表达式的基本语法和常用函数,可以帮助我们更高效地处理字符串操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值