前瞻断言

1 投票
1 回答
592 浏览
提问于 2025-04-16 23:27

我正在尝试在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

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

注意:我没有检查这个表达式是否真的适合你想解决的问题。

撰写回答