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

hpcdzsge  于 2023-08-08  发布在  Python
关注(0)|答案(4)|浏览(60)

如何查找不一定使用所有带有*+修饰符的字符的所有匹配项?

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

字符串
我需要将匹配锚定到字符串的开头(因此是^),但+似乎甚至没有考虑更短长度的匹配。我尝试将overlapped=True添加到findall调用中,但这不会更改输出。
使正则表达式为非贪婪(^\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 :(

Edit:^\d+正则表达式只是一个例子,但我需要它来处理任何可能的正则表达式。我应该事先说明这一点,我很抱歉。

cbeh67ev

cbeh67ev1#

您可以将overlapped=True与PyPi正则表达式模块一起使用,并反向搜索(?r)
然后从re.findall反转结果列表

import regex as re

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

字符串
产出

['1', '12', '123']


查看Python演示。

wsewodh2

wsewodh22#

那么一个积极的lookbehindAssert如何:

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

字符串

b91juud3

b91juud33#

使用标准库re

import re

matches = re.findall("^\d+", "123")
out = [m[:i] for m in matches for i in range(1, len(m)+1)]
print(out)

字符串
印刷品:

['1', '12', '123']

ekqde3dh

ekqde3dh4#

import re

m = re.findall(r'\d', '123')
op = ["".join(m[:i]) for i in range(1, len(m) + 1)]
print(op)

字符串
这稍微好一点,因为re.findall()只被调用一次

相关问题