Тест повторной компиляции "на лету" дает пустое совпадение, а не - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь протестировать несколько случаев регулярных выражений (особенно, если что-то является единицей измерения: 5px, 300mm и c).

Все вопросы, которые я могу найти о re.match, говорят мне, что я проверяю это следующим образом:

import re

test_phrase_good = "5kw"
test_phrase_bad = "5XXX"
registered_units_regex = re.compile('[0-9]+kw|[0-9]+mm', re.IGNORECASE)

# test in the following way:
registered_units_regex.match(token) is not None

# so:
print(registered_units_regex.match(test_phrase_good)) # <re.Match object; span=(0, 3), match='5kw'>
print(registered_units_regex.match(test_phrase_bad)) #  None

Как и ожидалось.

Однако, если я хочу скомпилировать регулярное выражение в al oop, я получаю следующее:

regex_units = [r"mm", r"kw"]
regex_string = r""
for unit in regex_units:
    regex_string += r'[0-9]+{}|'.format(unit)

regex_string = regex_string.rstrip('|')

registered_units_regex = re.compile(regex_string, re.IGNORECASE)
registered_units_regex.match(test_phrase_good) is not None

# so:
print(registered_units_regex.match(test_phrase_good)) # <re.Match object; span=(0, 3), match='5kw'>
print(registered_units_regex.match(test_phrase_bad)) #  <re.Match object; span=(0, 0), match=''>

, что означает, что я больше не могу использовать is None в качестве теста.

Почему это так? и как мне правильно проверить отсутствие совпадений?

1 Ответ

1 голос
/ 08 апреля 2020

| в конце регулярного выражения означает, что оно соответствует пустой строке. Вы должны только поставить | между альтернативами, а не до или после них Вы можете использовать join, чтобы сделать это.

У вас также есть [0-9]+ в обоих regex_units и в строке формата, вам не нужно это в обоих местах.

regex_units = ["mm","kw"]
regex_string = "|".join(r'[0-9]+{}|'.format(unit) for unit in regex_units)
...