鱼C论坛

 找回密码
 立即注册
查看: 1634|回复: 8

[已解决]正则表达式问题

[复制链接]
发表于 2020-3-11 16:12:35 From FishC Mobile | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、()对取值的影响
>>> m = re.match("([abc])+", "abc")
>>> m.groups()
('c',)
这里增加了一个()后,为什么groups()的值变成了('c',),实在不理解,如果‘c’是一个子集,那'a'、'b'为什么不能是一个子集呢?

二、()对一些全局函数的影响
>>> p = re.compile(r'\W+')
>>> p2 = re.compile(r'(\W+)')
>>> p.split('This... is a test.')
['This', 'is', 'a', 'test', '']
>>> p2.split('This... is a test.')
['This', '... ', 'is', ' ', 'a', ' ', 'test', '.', '']
为什么这里加了()后,对取值也产生了影响,我感觉这个问题可能和问题一是一个问题,就一起发出来

三、{}里的东西怎么理解
>>> p = re.compile('section{ ( [^}]* ) }', re.VERBOSE)
>>> p.sub(r'subsection{\1}','section{First} section{second}')
'subsection{First} subsection{second}'
我自己的理解是不是'}'的东西,'^}'
放在[]里使其成为去功能化字符'[^}]'
然后使其出现0至无限次数'[^}]*'
然后再用()括起来([^}]*),好像又影响了识别?和问题一、二的影响一样吗?
最后那么这个东西为什么能识别'section{}'这个东西,不管{}里是啥!
我好晕!

谢谢大拿
最佳答案
2020-3-11 19:42:49
一,自组是看‘(’来给编号的,所以就只有一个子组,这个子组最后给的值是'c'
二,我觉得就是这么规定的,捕获组的东西也会输出
三,( [^}]* )  是第一号自组,然后把这个自组给了r'subsection{\1}' 里面的\1,然后再用r'subsection{\1}'替换‘section{First}’也是个语法问题,就是这个定义的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-11 19:42:49 | 显示全部楼层    本楼为最佳答案   
一,自组是看‘(’来给编号的,所以就只有一个子组,这个子组最后给的值是'c'
二,我觉得就是这么规定的,捕获组的东西也会输出
三,( [^}]* )  是第一号自组,然后把这个自组给了r'subsection{\1}' 里面的\1,然后再用r'subsection{\1}'替换‘section{First}’也是个语法问题,就是这个定义的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-11 23:42:57 | 显示全部楼层
walleeee 发表于 2020-3-11 19:42
一,自组是看‘(’来给编号的,所以就只有一个子组,这个子组最后给的值是'c'
二,我觉得就是这么规定的, ...

非常感谢
第三个问题里,把( [^}]* ) 换成(.*)也能正常匹配吧,反正就是想{}里的东西完成不动保留的意思,那我用(.*)不就已经表示是所有字符了吗?我就是好奇为什么一定要用( [^}]* ) ?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-12 12:15:20 | 显示全部楼层
mmxvoodoo 发表于 2020-3-11 23:42
非常感谢
第三个问题里,把( [^}]* ) 换成(.*)也能正常匹配吧,反正就是想{}里的东西完成不动保留的意思 ...

你可以试一下,输出的结果不一样,造成问题的原因是贪婪模式。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-12 13:44:39 | 显示全部楼层
import re
#   一、()对取值的影响
m = re.match("([abc])+", "abc")
print(m.groups())
# 为什吗打印 ('c',)   [abc]是个集合,默认[abc]{1}  所以返回

m = re.match("([abc]+)", "abc")
print(m.groups())
#=============》('abc',)



#三、{}里的东西怎么理解
p = re.compile('section{(.*)}')
print(p.sub(r'subsection{\1}',
            'section{First} section{second}'))
#subsection{First} section{second}

'''
'section{ ( [^}]* ) }'
数据在{}之间,====》        section{*******}
需要个匹配组  ====》        section{(*****)}'
所需数据{开头,}结尾,不包含},[^}] 排除}之后的所有字符,又加了个数量限制 [^}]*
大体就这样
'''
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-14 07:01:06 | 显示全部楼层

非常感谢,解答非常清晰
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-14 07:08:52 | 显示全部楼层
walleeee 发表于 2020-3-12 12:15
你可以试一下,输出的结果不一样,造成问题的原因是贪婪模式。

自己又着重看了捕获组的知识,现在思路已经比原来清晰很多了,特别是第二题,加括号后形成的捕获组只是表达式的一个子集,表达式把所有的东西都显示出来,所以非捕获组子集的符号也就受到影响了,非常感谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-14 07:12:22 | 显示全部楼层
本帖最后由 mmxvoodoo 于 2020-3-14 07:22 编辑


试了一下
m = re.match("([abc]+).*?([abc])+.*", "baercacbcababbcabcc")
m.groups()
#('ba', 'c')

感觉比原来清晰多了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 16:09:38 | 显示全部楼层

找一两个可以折磨写
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 20:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表