опережающие утверждения - PullRequest
       9

опережающие утверждения

1 голос
/ 12 августа 2011

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

DOMAIN_LABEL_RE = """
\A(
(?<![\d\-]) # cannot start with digit or hyphen, looking behind
([a-zA-Z\d\-]*?)
([a-zA-Z]+)# need at least 1 letter
([a-zA-Z\d\-]*?)
(?!\-) # cannot end with a hyphen, looking ahead
)\Z
"""

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

Но строка "-asdf" по-прежнему совпадает: e.match (DOMAIN_LABEL_RE, "-asdf", re.VERBOSE) .group ()

Не знаюЯ не понимаю, почему он все еще совпадает.

Спасибо за любую помощь.

M.

1 Ответ

3 голосов
/ 12 августа 2011

\A соответствует началу строки, а следующий взгляд сзади соответствует, если перед этой позицией нет дефиса.

Вы находитесь в начале строки, конечно, перед ней нет символа!

Вместо этого используйте отрицательный прогноз: (?![\d\-]).

Похоже на конец строки. Вместо этого вы должны использовать отрицательный взгляд (?<!\-).

Я думаю, что эквивалентное выражение для вашего текущего будет:

DOMAIN_LABEL_RE = """
(?i               # case insensitive
  \A(
    ([a-z])       # need at least 1 letter and cannot start with digit or hyphen
    ([a-z\d-]*?)
    (?<!-)        # cannot end with a hyphen
  )\Z
)
"""

Примечание: Я не проверял, действительно ли выражение подходит для задачи, которую вы пытаетесь решить.

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