Python regex.findall 未找到所有较短长度的匹配项

Art*_*lay 6 python regex findall

如何找到不一定消耗带有*+修饰符的所有字符的所有匹配项?

import regex as re
matches = re.findall("^\d+", "123")
print(matches)
# actual output: ['123']
# desired output: ['1', '12', '123']
Run Code Online (Sandbox Code Playgroud)

我需要将匹配锚定到字符串的开头(因此是^),但+似乎甚至没有考虑较短长度的匹配。我尝试添加overlapped=Truefindall调用中,但这不会改变输出。

使正则表达式非贪婪 ( ^\d+?) 会导致输出['1']overlapped=True不输出。为什么它不想继续进一步搜索?

我总是可以自己制作较短的子字符串并使用正则表达式检查这些子字符串,但这似乎效率相当低,而且肯定有一种方法可以让正则表达式自己完成此操作。

s = "123"
matches = []
for length in range(len(s)+1):
    matches.extend(re.findall("^\d+", s[:length]))
print(matches)
# output: ['1', '12', '123']
# but clunky :(
Run Code Online (Sandbox Code Playgroud)

编辑:^\d+正则表达式只是一个示例,但我需要它适用于任何可能的正则表达式。我应该提前说明这一点,我很抱歉。

wim*_*wim 5

积极的后向断言怎么样:

>>> import regex as re
>>> re.findall(r'(?<=(^\d+))', '123')
['1', '12', '123']
Run Code Online (Sandbox Code Playgroud)


The*_*ird 5

您可以使用overlapped=TruePyPi 正则表达式模块和反向搜索 (?r)

然后反转re.findall的结果列表

import regex as re

res = re.findall(r"(?r)^\d+", "123", overlapped=True)
res.reverse()
print(res)
Run Code Online (Sandbox Code Playgroud)

输出

['1', '12', '123']
Run Code Online (Sandbox Code Playgroud)

请参阅Python 演示