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})+'
一个单引号,然后贪婪地出现:
- 不是单引号的字符
- 或者两个单引号在一起
后跟单引号。
对于您提供的模式,这应该有效:
'[\w']+'
即匹配单引号后跟一个或多个非空格或单引号后跟最后一个单引号。
当然,'(?:[^']|'')*'
是适用于此的正则表达式:它匹配 '
后跟除 '
之外的零个或多个字符或双 '
后跟尾随 '
.
但是,为了提高效率,您可以使用 unroll-the-loop technique.
展开 它
'[^']*(?:''[^']*)*'
请参阅 the regex demo 并注意正则表达式找到所有匹配项需要多少步。
正则表达式可以读作
'
- 匹配一个 '
[^']*
- 然后 '
以外的零个或多个字符
(?:''[^']*)*
- 然后 ''
的零个或多个序列后跟 '
以外的零个或多个字符
'
- 然后匹配尾随 '
.
这个正则表达式有一个线性模式,涉及尽可能少的回溯。
请注意:如果您添加先行检查是否存在 ,
或字符串结尾,您仍然可以使 您的 正则表达式适用于当前情况在尾随 '
:
之后
'.+?'(?=,|$)
^^^^^^^
参见regex demo。但是,它依赖于上下文并且效率低于展开的正则表达式。
我使用这个模式来匹配解析器中的单引号字符串:
"'.+?'"
但我需要正则表达式,它可以使用 postgres 找到单引号字符串,例如单个 qoutes 的转义(加倍单个 qoutes)。需要匹配这样的东西:
"'first', 'sec''ond', 't''hi''rd'"
我想找到以单引号开头和结尾的字符串的最短匹配项,因此上面的字符串意味着 3 个子字符串:
'first'
'sec''ond'
't''hi''rd'
'(?:[^']|'{2})+'
一个单引号,然后贪婪地出现:
- 不是单引号的字符
- 或者两个单引号在一起
后跟单引号。
对于您提供的模式,这应该有效:
'[\w']+'
即匹配单引号后跟一个或多个非空格或单引号后跟最后一个单引号。
当然,'(?:[^']|'')*'
是适用于此的正则表达式:它匹配 '
后跟除 '
之外的零个或多个字符或双 '
后跟尾随 '
.
但是,为了提高效率,您可以使用 unroll-the-loop technique.
展开 它'[^']*(?:''[^']*)*'
请参阅 the regex demo 并注意正则表达式找到所有匹配项需要多少步。
正则表达式可以读作
'
- 匹配一个'
[^']*
- 然后'
以外的零个或多个字符
(?:''[^']*)*
- 然后''
的零个或多个序列后跟'
以外的零个或多个字符
'
- 然后匹配尾随'
.
这个正则表达式有一个线性模式,涉及尽可能少的回溯。
请注意:如果您添加先行检查是否存在 ,
或字符串结尾,您仍然可以使 您的 正则表达式适用于当前情况在尾随 '
:
'.+?'(?=,|$)
^^^^^^^
参见regex demo。但是,它依赖于上下文并且效率低于展开的正则表达式。