【问题标题】:lookahead assertions前瞻断言
【发布时间】:2011-08-12 08:58:03
【问题描述】:

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

【问题讨论】:

  • 你已经交换了你的前进和后退。

标签: python regex regex-lookarounds


【解决方案1】:

\A 匹配字符串的开头,如果该位置之前没有连字符,则后面的查找匹配。

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

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

类似于字符串的结尾。你必须使用否定的lookbehind而不是(?&lt;!\-)

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

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

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

【讨论】:

  • 当您使用它时,将(?&lt;!-) 替换为[a-z\d]。 Lookahead and lookbehind 不需要申请这个职位。
  • @Alan:是的,我以前有过这个,但我没有考虑到不是连字符,所以我虽然消极的后视能更好地传达意图。当然我也可以应该只以字母或数字结尾... :D
  • @Alan,我不确定用 [a-z\d] 替换 (?
  • @user891441:是的。该文档还提到了re.I,这让我很困惑;)已修复。
猜你喜欢
  • 1970-01-01
  • 2015-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-15
相关资源
最近更新 更多