正则匹配问题:一个关于()\序号的子组问题
本帖最后由 新学 于 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}一样才对呀,怎么会这样? 首先()\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')]
# 如果不想修改原字符串,看到这里你也大概明白()\序号的作用了,就自己尝试去修改正则表达式吧
页:
[1]