【问题标题】:Python regex to match quoted string with escaped single quotesPython正则表达式将带引号的字符串与转义的单引号匹配
【发布时间】:2016-03-01 12:17:53
【问题描述】:

我使用这个模式来匹配解析器中的单引号字符串:

"'.+?'"

但我需要正则表达式,它可以找到带有 postgres 的单引号字符串,例如单个 qoutes 的转义(加倍单个 qoutes)。需要匹配这样的东西:

"'first', 'sec''ond', 't''hi''rd'"

我想找到以单引号开头和结尾的字符串的最短匹配,所以上面的字符串意味着 3 个子字符串:

'first'
'sec''ond'
't''hi''rd'

【问题讨论】:

  • 嵌套结构不应用正则表达式处理。

标签: python regex single-quotes


【解决方案1】:

当然,'(?:[^']|'')*' 是为此工作的正则表达式:它匹配 ' 后跟零个或多个字符而不是 ' 或双 's 后跟 '

但是,为了提高效率,您可以使用unroll-the-loop technique展开它。

'[^']*(?:''[^']*)*'

查看the regex demo 并注意正则表达式找到所有匹配项需要多少步。

正则表达式可以读作

  • ' - 匹配 '
  • [^']* - 然后是除' 之外的零个或多个字符
  • (?:''[^']*)* - 然后是零个或多个'' 序列,后跟零个或多个除' 以外的字符
  • ' - 然后匹配结尾的 '

此正则表达式具有线性模式,涉及尽可能少的回溯。

请注意:如果您添加前瞻检查是否有, 或尾随' 之后的字符串结尾,您仍然可以使您的 正则表达式适用于当前场景:

'.+?'(?=,|$)
     ^^^^^^^

请参阅regex demo。但是,它依赖于上下文并且效率低于展开的正则表达式。

【讨论】:

    【解决方案2】:

    '(?:[^']|'{2})+'

    一个单引号,后面跟着贪婪的:

    • 不是单引号的字符
    • 或两个单引号一起

    后跟单引号。

    演示:https://regex101.com/r/zP2eK6/1

    【讨论】:

      【解决方案3】:

      对于您提供的模式,这应该可以:

      '[\w']+'

      即匹配单引号后跟一个或多个非空格或单引号后跟最后一个单引号。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-08
        • 2014-05-12
        • 2011-12-04
        • 2010-09-13
        • 2011-09-25
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        相关资源
        最近更新 更多