鱼C论坛

 找回密码
 立即注册
查看: 1458|回复: 1

正则匹配问题:一个关于()\序号的子组问题

[复制链接]
发表于 2020-10-13 15:23:01 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 新学 于 2020-10-13 15:24 编辑

一个关于()\序号的子组问题
# 我想匹配的是 'python1 python2.7 python3.8.9 ’,希望得到的结果是 [('python3.8.9 ','python3.8.9')]
>>> re.findall('((python[\d.]*)[ ]*)\2', 'python1 python2.7 python3.8.9 c++9.80')
[] # 但是这里却返回一个空列表,我到底哪里理解错了,于是做了如下尝试
>>> re.search('((python[\d.]*)[ ]*)\2', 'python1 python2.7 python3.8.9 c++9.80') # 匹配不到
>>> re.search('((python[\d.]*)[ ]*){1,}', 'python1 python2.7 python3.8.9 c++9.80')
<re.Match object; span=(0, 30), match='python1 python2.7 python3.8.9 '> # 能匹配到具体字符串
>>> re.findall('((python[\d.]*)[ ]*)((python[\d.]*)[ ]*)((python[\d.]*)[ ]*)', 'python1 python2.7 python3.8.9 c++9.80')
[('python1 ', 'python1', 'python2.7 ', 'python2.7', 'python3.8.9 ', 'python3.8.9')]  # 将匹配到的字符串转化为一个包含各层子组的元组
>>> re.findall('((python[\d.]*)[ ]*)+', 'python1 python2.7 python3.8.9 c++9.80')
[('python3.8.9 ', 'python3.8.9')]   # 将匹配到的字符串转化为一个只包含最后一个嵌套子组的元组
>>> re.findall('((python[\d.]*)[ ]*){1,}', 'python1 python2.7 python3.8.9 c++9.80')
[('python3.8.9 ', 'python3.8.9')]
>>> re.findall('((python[\d.]*)[ ]*){3}', 'python1 python2.7 python3.8.9 c++9.80')
[('python3.8.9 ', 'python3.8.9')]

我认为()\2应该与(){3}一样才对呀,怎么会这样?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-10-13 18:20:40 | 显示全部楼层
首先()\2应该与(){3}不一样,\2代表第二个子组匹配到的字符串
# 下方\2代表子组2(python[\d.]*)匹配到的字符串,即 \2 == python1 
>>> re.findall('((python[\d.]*)[ ]*)\2', 'python1 python2.7 python3.8.9 c++9.80')
[]
# 当匹配到字符串 ‘python1 ’时,继续将python2与\2(即python1)比较,因为2!=1,而未匹配成功。
# 将原字符串中未匹配成功的2改成1,就能成功匹配到字符 python1 python1
>>> re.findall(r'((python[\d.]*)[ ]*)\2', 'python1 python1.7 python3.8.9 c++9.80')
[('python1 ', 'python1')]
# 如果不想修改原字符串,看到这里你也大概明白()\序号的作用了,就自己尝试去修改正则表达式吧
 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-10 23:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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