re.findall with or logic



在正则表达式 findall 中使用"|"时,我得到了 2 个项目的列表,其中一个是空白

的我尝试更改正则表达式格式几次,但没有任何效果。这是我在尝试不同变体后到目前为止所拥有的:

示例文件名:

231_HELLO_01.jpg
01_HELLO_WORLD.jpg
HELLO_01_WORLD.jpg

法典

pattern = '_(d{2}).?|^(d{2})_'
finddupe = re.findall(pattern, filename)

输出如下所示

[('01', '')]
[('02', '')]
[('01', '')]
[('02', '')]
[('01', '')]
[('02', '')]
[('03', '')]
[('04', '')]
[('05', '')]
[('06', '')]
[('07', '')]
[]

我只是想在没有空字符串和列表的情况下获取数字。

寻找:

01
02
01
03
04

您可以在其中一个备选方案中删除.?,因为它不会影响匹配和匹配时的组值:

import re
pattern = re.compile('^(d{2})_|_(d{2})')
m = pattern.search('12_text')
finddupe = ""
if m:
finddupe = f"{m.group(1) or ''}{m.group(2) or ''}"
# finddupe = "{}{}".format(m.group(1) or '', m.group(2) or '') # for Python versions not supporting interpolation
print(finddupe)

查看 Python 演示

我看到您需要在每个字符串中获取第一个匹配项,因此,使用返回所有、多个匹配项re.findall是没有意义的,re.search应该足够了。

好的,我无法判断它是否会涵盖您的所有数据,但您可以尝试以下方法:

names = ["231_HELLO_01.jpg", "01_HELLO_WORLD.jpg", "HELLO_01_WORLD.jpg"]
result = re.findall("[^d](d{2})[^d]", ' '.join(names))

运行后的结果值为:

>>> result
['01', '01', '01']

最新更新