【问题标题】:Using regex to write backslash character to file使用正则表达式将反斜杠字符写入文件
【发布时间】:2018-02-06 22:13:03
【问题描述】:

假设我收到一串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),但是,它会写两次而不是一次反斜杠,我不能写r'\',因为python不允许它。我该怎么做呢?

编辑更多信息:

我正在使用 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\")

【问题讨论】:

  • r'\\' 是正确的,问题没有问题,以错字结尾。
  • 我得到“语法错误:扫描字符串文字时 EOL”,因为反斜杠正在转义原始字符串引号
  • @usr2564301 不,只有 1 个文字反斜杠。OP 看到控制台输出。
  • Matt,我们需要确定看起来的字符串是否像你显示的那样的实际字符串。注意不要将 Python 显示的内容与字符串实际包含的内容混在一起。
  • @usr2564301 我用 sys.stderr.write(repr(code) + '\n') 找到了上面的字符串

标签: python regex


【解决方案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\\")'

【讨论】:

    猜你喜欢
    • 2020-07-23
    • 2015-07-14
    • 2023-03-13
    • 1970-01-01
    • 2012-06-01
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多