【问题标题】:Quotes text regex that ignores backslashes引用忽略反斜杠的文本正则表达式
【发布时间】:2020-10-23 04:17:56
【问题描述】:

我需要一个正则表达式来获取引号内的所有文本( ", ' ) 例如:

import re
i = 'Test Text 1 "Test Text 2"'
re.compile(regex).findall(i)
# Returns: ['"Test Text 2', '"']

到目前为止,我已经制作了这个正则表达式:

regex = ("(')([^']+)?|(\")([^\"]+)?")

这很好用,但有问题。我希望它像 python 引号颜色编码系统一样工作,所以如果在结束引号之前有反斜杠,我希望它不会停止元素。 例如:

import re
i = 'Test Text 1 "Test Text \\" 2"'
re.compile(regex).findall(i)
# Returns: ['"Test Text " 2', '"']

【问题讨论】:

  • 如果有两个反斜杠,这个假设的正则表达式是否需要忽略反斜杠前引号? (.. 实际上 any 偶数个反斜杠。)
  • 没有。如果它是'"Test Text \\\\"',那么它不应该忽略它,正如我所说的,就像 python 引号颜色编码一样。基本上正如你所说,偶数个反斜杠不应该被忽略

标签: python python-3.x regex re


【解决方案1】:

使用

import re
i = 'Test Text 1 "Test Text \\" 2"'
regex = r"(['\"])((?:\\.|(?!\1)[^\\])*)\1"
print( re.compile(regex, re.DOTALL).findall(i) )
# => [('"', 'Test Text \\" 2')]

请参阅 proofPython demo

(['"])((?:\\.|(?!\1)[^\\])*)\1 模式匹配第 1 组中的任何引号,然后匹配任何转义序列(使用 \\.)或捕获的引号和反斜杠 ((?!\1)[^\\]) 以外的任何字符,零次或多次,直到捕获的报价(请参阅\1)。

【讨论】:

  • 谢谢。这行得通,但是当没有结束引号时,它将后面带有反斜杠的引号声明为结束引号。例如:i = 'Test Text 1 "Test Text \\" 2'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 2015-06-20
  • 2014-11-12
  • 2012-06-01
  • 2015-01-24
相关资源
最近更新 更多