【问题标题】:python regex: escape illegal characters only if it's not escaped alreadypython regex:仅在尚未转义的情况下转义非法字符
【发布时间】:2016-08-03 21:36:31
【问题描述】:

现在我将文件作为字符串接收并将它们格式化为 json。该文件包含我想转义的 \r、\n 字符,但文件中的 json 对象已经转义了这些非法字符,例如 \\r 和 \\n。所以现在我想用 \\r \\n 替换 \r \n 字符,前提是它前面没有一个 \

我在下面尝试过这个..但我不确定为什么它不起作用

re.sub(r'[^\][\n]', r'\\\\n', s)

任何建议都将不胜感激!

【问题讨论】:

    标签: python json regex


    【解决方案1】:

    你可以使用 RegEx 来做到这一点:

    import re                                    
    
    data = 'Hello\r\nWorld\\r\\n'                
    print(data)                                  
    
    print('-'*20)                                
    
    data = re.sub(r'([^\\])\r', '\\1\\\\r', data)
    data = re.sub(r'([^\\])\n', '\\1\\\\n', data)
    print(data) 
    

    输出:

    Hello               
    World\r\n           
    --------------------
    Hello\r\nWorld\r\n  
    

    或者,稍微不同的方法是这样做:

    data = 'Hello\r\nWorld\\r\\n'                          
    print(data)                                            
    
    print('-'*20)                                          
    
    data = data.replace('\r', '\\r')
    data = data.replace('\n', '\\n')
    print(data)  
    

    输出:

    Hello               
    World\r\n           
    --------------------
    Hello\r\nWorld\r\n  
    

    【讨论】:

    • 每个中的第二个替换做什么?在我看来,一旦我们替换了所有 字符,就不会有任何 \\\r == <backslash><CR> 序列了
    • 最初的答案效果很好!谢谢!我会尝试正则表达式版本
    • 根据我对您的字符串的测试,不需要双重替换,请参阅 pastebin.com/v9DTn0hp 。这是因为您的第一个替换,它只影响 ASCII 13 回车不会影响任何文字反斜杠(ASCII 92)后跟文字 r(ASCII 114)
    • @turbulencetoo 你说得对,我忽略了这一点。我会进行编辑。谢谢
    猜你喜欢
    • 2011-09-09
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 2012-09-14
    相关资源
    最近更新 更多