пропустить ведущий номер в регулярном выражении? - PullRequest
2 голосов
/ 01 ноября 2019

Мне нужно извлечь реальный номер вопроса в моем имени файла. Существует 2 шаблона:

  1. , если в имени файла нет начального номера, то номер, который мы читаем первым, является номером проблемы. Например
asdasd 213.pdf             ---> 213
abcd123efg456.pdf          ---> 123
однако, иногда в имени файла есть начальный номер, который является просто индексом файла, поэтому я должен сначала проигнорировать / пропустить его. Например,
123abcd 4567sdds.pdf    ---> 4567, since 123 is ignored

890abcd 123efg456.pdf   ---> 123, since 890 is ignored

Я хочу узнать, возможно ли написать только одно регулярное выражение для его реализации? В настоящее время мой солютон состоит из 2 шагов:

  1. , если есть начальный номер, удалите его
  2. найдите номер в оставшейся строке

или вКод Python


import re

reNumHeading = re.compile('^\d{1,}', re.IGNORECASE | re.VERBOSE) # to find leading number
reNum = re.compile('\d{1,}', re.IGNORECASE | re.VERBOSE) # to find number


lstTest = '''123abcd 4567sdds.pdf
asdasd 213.pdf
abcd 123efg456.pdf
890abcd 123efg456.pdf'''.split('\n')

for test in lstTest:
    if reNumHeading.match(test):
        span =  reNumHeading.match(test).span()
        stripTest = test[span[1]:]
    else:
        stripTest = test

    result = reNum.findall(stripTest)
    if result:
        print(result[0])


спасибо

Ответы [ 2 ]

3 голосов
/ 01 ноября 2019

Просто сопоставьте цифры \d+, следующие за нецифрой \D:

import re

lstTest = '''123abcd 4567sdds.pdf
asdasd 213.pdf
abcd 123efg456.pdf
890abcd 123efg456.pdf'''.split('\n')

for test in lstTest:
    res = re.search(r'\D(\d+)', test)
    print(res.group(1))

Вывод:

4567
213
123
123
3 голосов
/ 01 ноября 2019

Вы можете использовать ? квантификатор для определения необязательного шаблона

>>> import re
>>> s = '''asdasd 213.pdf
... abcd123efg456.pdf
... 123abcd 4567sdds.pdf
... 890abcd 123efg456.pdf'''
>>> for line in s.split('\n'):
...     print(re.search(r'(?:^\d+)?.*?(\d+)', line)[1])
... 
213
123
4567
123
  • (?:^\d+)? здесь группа без захвата и ? квантификатор используется для необязательного совпадения цифр в начале строки
    • , так как + является жадным, все начальные цифры будут совпадать
  • .*? соответствует любому количеству символов минимально (потому что нам нужно первое совпадение цифр)
  • (\d+) требуемые цифры для захвата
  • re.search возвращает re.Match объект, из которого вы можете получить различные детали
  • [1] на *Объект 1026 * выдаст вам строку, захваченную первой группой захвата
    • , используйте .group(1), если вы используете более старую версию Python, которая не поддерживает синтаксис [1]

См. Также: Справочник - Что означает это регулярное выражение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...