除了首尾字符外,正则表达式替换

3

如何使用正则表达式将字符串中的双引号(")替换为转义反斜杠后跟随双引号(\"),但不包括字符串的第一个和最后一个字符。

示例1:字符串中嵌入双引号

Input: "This is a "Test""
Expected Output: "This is a \"Test\""

示例2:字符串中没有双引号

Input: "This is a Test"
Expected Output: "This is a Test"

当我在Python中执行re.sub()操作时,所有内容都会被替换,包括第一个和最后一个双引号字符。在上面的示例中,输出字符串变为:"This is a Test"。

如果你想创建一个将输入转换为转义字符串的实用程序,那么为什么不使输入摆脱周围的引号",并使输出转义内部的引号,并包括周围的引号呢? - nhahtdh
3个回答

8

我不知道你是怎么想的,但我会选择最简单的方法:

'"{}"'.format(s[1:-1].replace('"',r'\"'))

当然,这里有一些假设——最为强大的假设是第一个和最后一个字符始终是双引号……

也许这样会更好一些:

'{0}{1}{2}'.format(s[0],s[1:-1].replace('"',r'\"'),s[-1])

该函数保留字符串的首尾字符,并在中间转义所有双引号。


哇,你的正则表达式功夫很强。 - Grant Birchmeier
@mgilson - 我打赌你的敌人也是这样。 - Grant Birchmeier
如果原始问题没有要求使用正则表达式,那么这应该是被接受的答案。=) - jhuynh

5
正如@mgilson指出的那样,您可以切掉第一个和最后一个字符,所以这个正则表达式基本上没用。
>>> print re.sub(r'(?<!^)"(?!$)', '\\"', '"This is a "Test""')
"This is a \"Test\""
>>> print re.sub(r'(?<!^)"(?!$)', '\\"', '"This is a Test"')
"This is a Test"

1

很遗憾,我认为您无法仅使用一个正则表达式完成此操作。但是,您可以通过三个正则表达式进行伪造。

>>> x = '"This is "what" it is"'
>>> print x
"This is "what" it is"
>>> x = re.sub(r'"',r'\\"',x)
>>> print x
\"This is \"what\" it is\"
>>> x = re.sub(r'^\\"','"',x)
>>> print x
"This is \"what\" it is\"
>>> x = re.sub(r'\\"$','"',x)
>>> print x
"This is \"what\" it is"

第一个正则表达式将所有引号转换为转义引号。
第二个正则表达式将前导引号改回(如果没有前导引号,则无效)。
第三个正则表达式将尾随引号改回(如果没有尾随引号,则无效)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接