所以假设我收到一串python代码,如下所示:
"def fib(num):\\n\\t#insert code here\\n\\tnumbers = [1, 2, 3]\\n\\tfor n in numbers:\\n\\t print(n + \\"\\\\n\\")"
我想重写这个字符串,以便每次有两个反斜杠时,它们会被一个反斜杠替换。
我尝试过使用code = re.sub(r'(\\)+', "\\", code)
但是它给了我一个错误,因为正则表达式模式以反斜杠结尾not allowed。
但是,如果我尝试编写code = re.sub(r'(\\)+', r'\\', code)
,它会反复写两次反斜杠而不是一次,因为python不会允许它,所以我不能写r'\'
。我该怎么做呢?
我使用sys.stderr.write(repr(code)+' \ n')来查找字符串的表示
使用上面的字符串作为输入,我得到以下结果:
code = re.sub(r'(\\\\)+', r"\\", code)
收益率:'def fib(num):\\n\\t#insert code here\\n\\tnumbers = [1, 2, 3]\\n\\tfor n in numbers:\\n\\t print(n + \\"\\n\\")'
并写入文件:\n\t#insert code here\n\tnumbers = [1, 2, 3]\n\tfor n in numbers:\n\t print(n + \"\n\")
code = code.replace(r'\\', '\\')
收益率:'def fib(num):\\n\\t#insert code here\\n\\tnumbers = [1, 2, 3]\\n\\tfor n in numbers:\\n\\t print(n + \\"\\n\\")'
并写入文件:\n\t#insert code here\n\tnumbers = [1, 2, 3]\n\tfor n in numbers:\n\t print(n + \"\n\")
code = re.sub(r'(\\)+', "\\", code)
收益率错误:sre_constants.error: bad escape (end of pattern) at position 0
code = re.sub(r'(\\)+', r'\\', code)
收益率:'def fib(num):\\n\\t#insert code here\\n\\tnumbers = [1, 2, 3]\\n\\tfor n in numbers:\\n\\t print(n + \\"\\n\\")'
并写入文件:\n\t#insert code here\n\tnumbers = [1, 2, 3]\n\tfor n in numbers:\n\t print(n + \"\n\")
答案 0 :(得分:-1)
不要使用re
,因为它(显然!)有反斜杠的各种问题。您可以使用标准replace
功能:
c = code.replace(r'\\','\\')
- 请注意第一个字符串前的r
,但第二个字符串前的不是。
这会替换原始字符串中单个出现的\\
(其中有12个反斜杠,但只有一个):
code = 'def fib(num):\\n\\t#insert code here\\n\\tnumbers = [1, 2, 3]\\n\\tfor n in numbers:\\n\\t print(n + \\"\\\\n\\")'
c = code.replace(r'\\','\\')
print (c)
结果
def fib(num):\n\t#insert code here\n\tnumbers = [1, 2, 3]\n\tfor n in numbers:\n\t print(n + \"\n\")
此结果的其他表示仍然可以显示双反斜杠,但这正是Python所做的:
>> c
'def fib(num):\\n\\t#insert code here\\n\\tnumbers = [1, 2, 3]\\n\\tfor n in numbers:\\n\\t print(n + \\"\\n\\")'
>>> sys.stderr.write(repr(c)+'\n')
'def fib(num):\\n\\t#insert code here\\n\\tnumbers = [1, 2, 3]\\n\\tfor n in numbers:\\n\\t print(n + \\"\\n\\")'