【问题标题】:Regex named conditional lookahead (in Python)正则表达式命名条件前瞻(在 Python 中)
【发布时间】:2013-07-07 22:41:00
【问题描述】:

我希望根据字符串后面是否出现某个字符块来不同地匹配字符串的开头。一个非常简化的版本是:

re.search("""^(?(pie)a|b)c.*(?P<pie>asda)$""", 'acaaasda')

如果匹配&lt;pie&gt;,我想在字符串的开头看到a,如果不是,那么我宁愿看到b

我会使用正常的数字前瞻,但无法保证这两个组之间将匹配或不匹配多少组。

我目前收到error: unknown group name。我的直觉告诉我,这是因为我想要的是不可能的(预测命名组并不完全是 regular 语言解析器的功能),但我真的真的很想要这可以工作——另一种方法是放弃 4 或 5 小时的正则表达式编写,并在明天将其全部重做为递归下降解析器或其他东西。

提前感谢您的帮助。

【问题讨论】:

  • 你在搜索/解析什么样的文本?
  • 你想达到什么目的?我在您的字符串中没有看到任何pie。您能提供一些带有相应输出的示例输入吗?
  • 你能发布你真正想要的文字吗?
  • 粘贴似乎会破坏格式并超出字符限制。但我得到的是我有一个数量,(?P&lt;amt&gt;%s|[0-9]*\.?[0-9]+|([0-9]+\s+)?[0-9]+\/[0-9]+),(其中 %s 是onetwoa 等)一个度量单位,然后是一些其他的东西。但是,如果您有一个部分结构,则不必存在数量,例如“一小撮盐”或“苦艾酒的香气”。由于我使用它来对行进行分类和解析,因此我也必须抓住它们,以免它们被视为instructionname 而不是ingredient_line

标签: python regex conditional named lookahead


【解决方案1】:

你可以使用类似的东西:

^(?:a(?=c.*(?P<pie>asda)$)|b)c.*$

如果您不需要,也可以不使用.*$

【讨论】:

    【解决方案2】:

    不幸的是,我认为没有一种方法可以对命名组进行您想做的事情。如果您不介意重复太多,您可以将共享条件和OR 表达式复制在一起:

    ^(ac.*asda|bc.*)$
    

    如果它是一个复杂的表达式,您总是可以使用字符串格式来共享它(而不是复制粘贴共享部分):

    common_regex = "c.*"
    final_regex = "^(a{common}asda|b{common})$".format(common=common_regex)
    

    【讨论】:

    • 我认为这就是我最终可能会做的事情。让我感到震惊的是,我可能只需要重写一些其他正则表达式,以便它们需要向后查看 amt 名称(参见上面的 sn-p 回复)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 2018-12-28
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    相关资源
    最近更新 更多