用或逻辑重新定义

时间:2019-10-09 17:23:29

标签: python regex

使用'|'时,我得到2个项目的清单在regex findall中,其中之一为空白

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

文件名示例:

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

2 个答案:

答案 0 :(得分:1)

您可以在其中一种方法中删除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) ,因为它不会影响匹配并在匹配时合并组值:

re.findall

请参见Python demo

我看到您需要在每个字符串中获得第一个匹配项,因此,使用re.search来返回所有多个匹配项是毫无意义的,ModuleNotFoundError: No module named '_ssl'就足够了。

答案 1 :(得分:0)

好的,我无法确定它是否可以覆盖您的所有数据,但是您可以尝试以下操作:

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']