re.indall с или логикой - PullRequest
       6

re.indall с или логикой

1 голос
/ 09 октября 2019

Я получаю список из 2 пунктов при использовании '|'в регулярных выражениях 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 ]

1 голос
/ 09 октября 2019

Вы можете удалить .? в одной из альтернатив, поскольку она не влияет на сопоставление и значения группы совпадений при совпадении:

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 должно быть достаточно.

0 голосов
/ 09 октября 2019

Хорошо, я не могу сказать, охватит ли он все ваши данные, но вы можете попробовать следующее:

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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...