Как регулярное выражение для числового суффикса? - PullRequest
0 голосов
/ 24 января 2019

У меня есть следующее регулярное выражение (пример на Python):

pattern = re.compile(r'^(([a-zA-Z0-9]*[a-zA-Z]+)([\d]+)|([\d]+))$')

Это правильно анализирует любую строку, которая имеет числовой суффикс и необязательный префикс, который является буквенно-цифровым:

a123
a2a123
123

Все правильно увидят 123 в качестве суффикса. Он будет правильно отклонять неверные данные:

abc
123abc
()123  # Or other non-alphanumerics

Однако само регулярное выражение довольно громоздко, и в результате некоторые из групп захвата часто оказываются пустыми, что означает, что мне нужно пройти дополнительный этап их фильтрации. Мне любопытно, есть ли лучший способ думать об этом регулярном выражении, чем «число ИЛИ число, которому предшествует буквенно-цифровое число, заканчивающееся символом»?

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Вы можете использовать

^[A-Za-z0-9]*?([0-9]+)$

См. Демоверсию regex

Подробности

  • ^- начало строки
  • [A-Za-z0-9]*? - любые буквы / цифры, ноль или более раз, как можно меньше (из-за этого не жадного соответствия следующий шаблон, ([0-9]+), будет соответствовать всем цифрам вконец строки есть)
  • ([0-9]+) - группа 1: одна или несколько цифр
  • $ - конец строки.

В Python:

m = re.search(r'^[A-Za-z0-9]*?([0-9]+)$') # Or, see below
# m = re.match(r'[A-Za-z0-9]*?([0-9]+)$') # re.match only searches at the start of the string
# m = re.fullmatch(r'[A-Za-z0-9]*?([0-9]+)') # Only in Python 3.x 
if m:
    print(m.group(1))
0 голосов
/ 24 января 2019

Если вы используете группы без захвата и правильное управление повторениями, проблема устраняется сама собой.

pattern = re.compile(r'^(?:[a-zA-Z0-9]*[a-zA-Z]+)?([0-9]+)$')

Существует только одна группа захвата (группа 1) для суффикса и буквенно-цифровые символы, прежде чем он не будет захвачен.

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

pattern = re.compile(r'^(?P<a>[a-zA-Z0-9]*[a-zA-Z]+)?(?P<suffix>[0-9]+)$')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...