前瞻断言
我正在尝试在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
)
"""
注意:我没有检查这个表达式是否真的适合你想解决的问题。