Мне нужно проверить следующий формат строки:
text-text-id-text
Разделителем является символ «-». Третий столбец всегда должен иметь идентификатор. Я написал следующее регулярное выражение (на Python), которое проверяет строку:
import re
s = 'col1-col2-col3-id' # any additional text at the end
# is allowed e.g. -col4-col5
print re.match('^(.*-){3}id(-.*)?$', s) # ok
print re.match('^(.*-){1}id(-.*)?$', s) # still ok, is should not be
Я пробовал добавить нежадный режим, но результат тот же:
^(.*?-){1}id(-.*)?$
Что мне не хватает в моем регулярном выражении? Я мог бы просто проверить строку вот так:
>>> import re
>>> print re.split('-', 'col1-col2-col3-id')
['col1', 'col2', 'col3', 'id']
А затем проверьте, соответствует ли третий элемент идентификатору, но меня интересует, почему первое регулярное выражение работает, как указано выше.
1 ответ
Ваше первое регулярное выражение неверно, поскольку оно утверждает, что id
присутствует после первых трех элементов.
Ваше второе регулярное выражение неправильно соответствует строке, потому что .*
также соответствует дефисам.
Вы должны использовать это регулярное выражение:
/^(?:[^-]+-){2}id/
Вот демонстрация регулярного выражения!
А если вам нужно привязать регулярное выражение к концу, используйте /^(?:[^-]*-){2}id.*$/
!
Как упоминал Тим Пицкер, рассмотрите возможность утверждения id
в конце элемента:
/^(?:[^-]+-){2}id(?![^-])/
Вот ОБНОВЛЕННАЯ демонстрация регулярных выражений!
Похожие вопросы
Связанные вопросы
Новые вопросы
python
Python — это мультипарадигмальный многоцелевой язык программирования с динамической типизацией. Он предназначен для быстрого изучения, понимания и использования, а также обеспечивает чистый и унифицированный синтаксис. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Если у вас есть вопросы о версии Python, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas, NumPy) укажите это в тегах.