Regex не исключает случаев Python - PullRequest
0 голосов
/ 01 марта 2019

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

date: 1:10 #7 (correct)
date: 1:10 (correct)
1:10 #7 (correct)
13.01.06 (incorrect)

Вот мое регулярное выражение, разработанное на pythex:

(date)? ?\D? ?(1|4) ?(:|-|\.) ?[-+]?[0-9]+( ?(#) ?[a-zA-Z0-9]?)?

enter image description here

Я работаю в проектах на Python, которые используют OCR, поэтому иногда «:» между 1 и 10 не переводится правильно.Ребята, у вас есть лучший способ решить проблему с регулярным выражением?

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Необходимо сделать обязательным нецифровый шаблон, удалив ? после \D и обернуть всю деталь перед шаблоном (1|4) дополнительной группой без захвата (для соответствия date, :и пробел необязательно), и в конце добавьте границу слова перед шаблоном (1|4), чтобы его можно было сопоставить только как целое слово, когда цифре не предшествует цифра, буква или _.

(?:(date)? ?\D ?)?\b([14]) ?([-:.]) ?[-+]?([0-9]+)( ?# ?([a-zA-Z0-9]*))?
^^^           ^  ^^^

См. Демонстрационную версию regex .

0 голосов
/ 01 марта 2019

Вам специально нужно регулярное выражение?Если нет, вы можете решить вашу проблему, проанализировав строку как datetime.

from datetime import datetime
def test_date(date_string):
    try:
        datetime.strptime(date_string, '%d.%m.%y')
        return # or do something else to skip the further processing
    except ValueError:
        pass
    # Process valid date string
    print('Valid date: {}'.format(date_string))

test_date('13.01.06') # Does not print anything
test_date('1:10 #7')  # Works!
...