先行断言

时间:2011-08-12 08:58:03

标签: python regex regex-lookarounds

我正在尝试使用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,“ - atdf”,re.VERBOSE).group()

我不明白为什么它仍然匹配。

感谢您的帮助。

微米。

1 个答案:

答案 0 :(得分:3)

如果在该位置之前没有连字符,则

\A匹配字符串的开头和以下的lookbehind匹配。

你在字符串的开头,当然之前没有字符!

使用否定前瞻:(?![\d\-])

类似于字符串的结尾。你必须使用负面的lookbehind而不是(?<!\-)

我认为当前表达式的等效表达式为:

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
)
"""

注意:我没有检查表达式是否真的适合您要解决的问题。