【问题标题】:Regex: Correctly matching groups with negative lookback正则表达式:正确匹配具有负面回溯的组
【发布时间】:2017-05-26 20:08:39
【问题描述】:

我正在使用这个字符串:

qr/I Love Chocolate|And Free Shipping|All (day|night)|please/i;

我正在使用以下正则表达式模式:

(?:qr\/)?(.*?)(?:\||\/)

我想找回以下匹配项:

["I Love Chocolate", "And Free Shipping", "All (day|night)", "please"]

然而,这是我真正得到的回报:

["I Love Chocolate", "And Free Shipping", "All (day", "night)", "please"]

我修改了我的正则表达式以使用回溯:

(?:qr\/)?(?<!All \(day|night\))(.*?)(?:\||\/)

但是,这仍然会将字符串拆分为All (daynight)

如何调整正则表达式,而不是将All (daynight) 捕获为单独的字符串,而是得到All (day|night)

更一般地说,麻瓜语言的目标是:“查找任何由竖线字符分隔的组,除非该组包含 1 个或多个被省略号包围的竖线字符;在这种情况下,将整个字符串视为一个组。”

【问题讨论】:

    标签: python regex


    【解决方案1】:

    您可以使用此正则表达式进行匹配:

    [^/|(]+(?:\([^)]*\))*
    

    代码:

    >>> str = 'qr/I Love Chocolate|And Free Shipping|All (day|night)|please/i'
    >>> print re.findall(r'[^/|(]+(?:\([^)]*\))*', str)
    ['qr', 'I Love Chocolate', 'And Free Shipping', 'All (day|night)', 'please', 'i']
    

    或者,如果您想在开始时丢弃qr/,最后丢弃/i,请使用:

    >>> print re.findall(r'[^/|(]+(?:\([^)]*\))*', re.sub(r'^qr/(.*)/i$', r'\1', str))
    ['I Love Chocolate', 'And Free Shipping', 'All (day|night)', 'please']
    

    RegEx Demo

    【讨论】:

      【解决方案2】:

      如果只是 daynight 围绕 | 的单词,您可以使用负向后视和负向前瞻

      >>> re.split(r"(?<!day)\|(?!night)", s)
      ['qr/I Love Chocolate', 'And Free Shipping', 'All (day|night)', 'please/i;']
      

      我还会事先删除 qr/ 前缀和 /i 后缀,以保持拆分表达式的简单性。比如这样:

      >>> s = "qr/I Love Chocolate|And Free Shipping|All (day|night)|please/i;"
      >>> s = re.sub(r"^[a-z]+/", "", s)
      >>> s = re.sub(r"/[a-z]+;$", "", s)
      

      然后,拆分:

      >>> re.split(r"(?<!day)\|(?!night)", s)
      ['I Love Chocolate', 'And Free Shipping', 'All (day|night)', 'please']
      

      【讨论】:

      • All (day|night) 只是众多类似模式之一。所以理想情况下,我想说“匹配管道符号之间的任何内容,除非匹配包含 1 个或多个被椭圆包围的管道符号,在这种情况下,将整个事物视为一组。”
      • @DirtyPenguin 啊,好吧,那我认为anubhava的解决方案应该涵盖这些,试试看。我看看能不能改进我的。谢谢。
      • 感谢您提供后向/前瞻示例 :)
      猜你喜欢
      • 1970-01-01
      • 2012-12-06
      • 1970-01-01
      • 1970-01-01
      • 2017-08-23
      • 1970-01-01
      • 2016-05-11
      • 1970-01-01
      相关资源
      最近更新 更多