【发布时间】:2021-07-08 18:20:23
【问题描述】:
在尝试构建正则表达式以转义字符串中的 "s 时,我遇到了一个问题,即我无法获得正确的反斜杠 # 来获得所需的 (\") 输出。
data=""" {
value1: "blah",
value2: 'foo<a href="example.com">bar</a>',
}"""
该模式适用于另一个字符(例如 \1!\2 -> !"):
>>> re.sub(r'(.*?)(".*?)',r'\1!\2',data, re.MULTILINE)
' {\n value1: !"blah!",\n value2: \'foo<a href=!"example.com!">bar</a>\',\n }'
但单独的反斜杠似乎无法逃脱[如预期的那样]:
>>> re.sub(r'(.*?)(".*?)',r'\1\\2',data, re.MULTILINE)
" {\n value1: \\2blah\\2,\n value2: 'foo<a href=\\2example.com\\2>bar</a>',\n }"
>>> re.sub(r'(.*?)(".*?)',r'\1\\\2',data, re.MULTILINE)
' {\n value1: \\"blah\\",\n value2: \'foo<a href=\\"example.com\\">bar</a>\',\n }'
>>> re.sub(r'(.*?)(".*?)',r'\1\\\\2',data, re.MULTILINE)
" {\n value1: \\\\2blah\\\\2,\n value2: 'foo<a href=\\\\2example.com\\\\2>bar</a>',\n }"
>>> re.sub(r'(.*?)(".*?)',r'\1\\\\\2',data, re.MULTILINE)
' {\n value1: \\\\"blah\\\\",\n value2: \'foo<a href=\\\\"example.com\\\\">bar</a>\',\n }'
并且没有raw 字符串:
>>> re.sub(r'(.*?)(".*?)','\\1!\\2',data, re.MULTILINE)
' {\n value1: !"blah!",\n value2: \'foo<a href=!"example.com!">bar</a>\',\n }'
>>> re.sub(r'(.*?)(".*?)','\\1\\\2',data, re.MULTILINE)
" {\n value1: \\\x02blah\\\x02,\n value2: 'foo<a href=\\\x02example.com\\\x02>bar</a>',\n }"
>>> re.sub(r'(.*?)(".*?)','\\1\\\\2',data, re.MULTILINE)
" {\n value1: \\2blah\\2,\n value2: 'foo<a href=\\2example.com\\2>bar</a>',\n }"
>>> re.sub(r'(.*?)(".*?)','\\1\\\\\2',data, re.MULTILINE)
" {\n value1: \\\x02blah\\\x02,\n value2: 'foo<a href=\\\x02example.com\\\x02>bar</a>',\n }"
>>> re.sub(r'(.*?)(".*?)','\\1\\\\\\2',data, re.MULTILINE)
' {\n value1: \\"blah\\",\n value2: \'foo<a href=\\"example.com\\">bar</a>\',\n }'
结果中总会有太多的反斜杠(在 sub 中使用偶数 #),否则组的反斜杠 (\2) 将被转义 - 在输出中只留下组号。
我认为我需要类似于 bash 的 ${varName}PM 的东西,如果没有大括号 $varNamePM 会查找名为 varNamePM 的变量,而不是连接 @ 的内容987654338@ 与字符串 PM。
(没有re.MULTILINE,输出似乎也一样)
(使用\\g<1> 指定捕获组也没有帮助。参考:https://stackoverflow.com/a/5984688/10761353)
更新: 根据@marcel-wilson 的回答,这是功能结果:
>>> res = re.sub(r'(.*?)(".*?)',r'\1\\\2',data, re.MULTILINE)
>>> res
' {\n value1: \\"blah\\",\n value2: \'foo<a href=\\"example.com\\">bar</a>\',\n }'
>>> print(res)
{
value1: \"blah\",
value2: 'foo<a href=\"example.com\">bar</a>',
}
[ manually replace single- -> dbl-quotes & remove trailing `,` on value2 ]
>>> res2
' {\n "value1": "blah",\n "value2": "foo<a href=\\"example.com\\">bar</a>"\n }'
>>> print(res2)
{
"value1": "blah",
"value2": "foo<a href=\"example.com\">bar</a>"
}
>>> json.loads(res2)
{'value1': 'blah', 'value2': 'foo<a href="example.com">bar</a>'}
【问题讨论】:
-
我不懂 Python,但regex101.com/r/LTnAzz/1/codegen?language=python 会是一个好的开始。查看他们的代码示例并相应地修改您的代码。
-
我已经在使用它了,它已经在 regex101 上工作了(使用
\1\\\2):regex101.com/r/KCCFh1/1。 -
这能回答你的问题吗? Can't escape the backslash with regex?
-
谢谢,但不行:[quad-backslash] 已经在我的 [不成功] 示例中:
r'\1\\\\\2'->...\\\\"...和'\\1\\\\\\2'->...\\"...
标签: python-3.x regex python-re