Python 正则表达式匹配带转义单引号的引号字符串

Python regex to match quoted string with escaped single quotes

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

"'.+?'"

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

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

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

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

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

一个单引号,然后贪婪地出现:

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

后跟单引号。

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

对于您提供的模式,这应该有效:

'[\w']+'

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

当然,'(?:[^']|'')*' 是适用于此的正则表达式:它匹配 ' 后跟除 ' 之外的零个或多个字符或双 ' 后跟尾随 '.

但是,为了提高效率,您可以使用 unroll-the-loop technique.

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

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

正则表达式可以读作

  • ' - 匹配一个 '
  • [^']* - 然后 '
  • 以外的零个或多个字符
  • (?:''[^']*)* - 然后 '' 的零个或多个序列后跟 '
  • 以外的零个或多个字符
  • ' - 然后匹配尾随 '.

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

请注意:如果您添加先行检查是否存在 , 或字符串结尾,您仍然可以使 您的 正则表达式适用于当前情况在尾随 ':

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

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