gpt4 book ai didi

python - 在 Python 中重复捕获奇怪的结果

转载 作者:太空宇宙 更新时间:2023-11-03 13:36:28 24 4
gpt4 key购买 nike

我想重复出现的自然数并捕获所有的自然数。

import re
r = "the ((sixty|six)[ -]+)+items"
s = "the sixty six items"
re.findall(r, s)
# [('six ', 'six')]

它匹配了'six' 2次,同时可以观察到它可能永远不会匹配'six six';相反,它必须匹配“六十六”,但捕获返回 ('six', 'six')。

这里发生了什么,我该如何返回 ('sixty', 'six')?

最佳答案

re.search 只会找到第一个与模式匹配的东西,一旦找到匹配项,它就不会再寻找其他匹配项。您得到 ('six ', 'six') 因为您将一个捕获组嵌套在另一个捕获组中; 'six' 匹配外部组,'six'(没有尾随空格)匹配内部组。

您可以在某些非捕获组中使用两个未嵌套的捕获组来做您想做的事情,这些捕获组使用 (?:...) 语法。

import re

r = "the (?:(?:(sixty)|(six))[ -]+)+items"
s = "the sixty six items"
m = re.search(r, s)
if m:
print(m.groups())

输出

('sixty', 'six')

这将返回一个包含两个项目的元组,因为我们在模式中有两个捕获组。

这是一个更长的演示。

import re

pat = re.compile("the (?:(?:(sixty)|(six))[ -]+)+items")

data = (
"the items",
"the six items",
"the six six items",
"the sixty items",
"the six sixty items",
"the sixty six items",
"the sixty-six items",
"the six sixty sixty items",
)

for s in data:
m = pat.search(s)
print('{!r} -> {}'.format(s, m.groups() if m else None))

输出

'the items' -> None
'the six items' -> (None, 'six')
'the six six items' -> (None, 'six')
'the sixty items' -> ('sixty', None)
'the six sixty items' -> ('sixty', 'six')
'the sixty six items' -> ('sixty', 'six')
'the sixty-six items' -> ('sixty', 'six')
'the six sixty sixty items' -> ('sixty', 'six')

关于python - 在 Python 中重复捕获奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38915491/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com