正则表达式匹配所有封闭''(2单引号)

时间:2016-03-03 21:49:01

标签: python regex

我正在寻找一个正则表达式,它会为单引号字符串中的每组2个单引号('')提供捕获组'string')是逗号分隔列表的一部分。例如,字符串'tom''s'ms之间只有一个组。我已经接近了,但是由于错误地与封闭的单引号匹配或者仅捕获字符串中的一些2个单引号而不断被绊倒。

示例输入

'11','22'',','''33','44''','''55''','6''''6'

所需群组(7,以parens显示)

 '11','22(''),','('')33','44('')','('')55('')','6('')('')6'

对于上下文,我最终尝试做的是将逗号分隔的字符串序列中的这两个单引号替换为另一个值,以便后续解析更容易。

另请注意,逗号可以包含在单引号字符串中。

1 个答案:

答案 0 :(得分:3)

您无法将这样的双单引号与Python re模块匹配。您只需匹配单引号条目并捕获每个条目的内部部分,并使用lambda,将''内部替换为仅.replace

import re
p = re.compile(r"'([^']*(?:''[^']*)*)'")
test_str = "'11','22'',','''33','44''','''55''','6''''6'"
print(p.sub(lambda m: "'{}'".format(m.group(1).replace("''", "&")), test_str))

请参阅IDEONE demo,输出:'11','22&,','&33','44&','&55&','6&&6'

正则表达式是'([^']*(?:''[^']*)*)'

  • ' - 开启'
  • ( - 捕获组#1开始
  • [^']* - 零或更多非 - '
  • (?:''[^']*)* - 0+序列''后跟0 +非'
  • ) - 捕获组#1结束
  • ' - 关闭'