我有以下字符串
mystr1 = 'mydirname'
myfile = 'mydirname\myfilename'
Run Code Online (Sandbox Code Playgroud)
我正在努力做到这一点
newstr = re.sub(mystr1 + "\","",myfile)
Run Code Online (Sandbox Code Playgroud)
如何逃避我试图连接到mystr1的反斜杠?
另请参阅为什么我不能用反斜杠结束原始字符串?而为什么不能Python的原始字符串文字用一个反斜杠结束?问题和相关答案.
在我的Python 2程序中,我使用了大量带有嵌入式反斜杠的文字字符串.我可以使用另一个反斜杠来转义每个反斜杠(例如:) "red\\blue"或使用Python原始字符串(例如:) r"red\blue".我已经对原始字符串方法进行了标准化,除了一个方法之外,它在所有情
如果我想表示一个双反斜杠,我可以使用r"\\",但如果我尝试输入一个反斜杠文字r"\"Python抱怨语法错误.显而易见的解决方法是"\\"在这种情况下使用,但为什么单个原始字符串反斜杠是错误的? 这是Python中的错误吗? 有没有办法将单个反斜杠编码为原始字符串?
例:
>>> r"red\blue"
'red\\blue'
>>> r"\\"
'\\\\'
>>> r"\"
File "<stdin>", line 1
r"\"
^
SyntaxError: EOL while scanning string literal
>>>
Run Code Online (Sandbox Code Playgroud)
我宁愿在整个程序中使用原始字符串保持一致,并且"\\"在几个地方使用它看起来像一个kludge.使用r"\\"[0]并不是更好.我一直在使用一个常数也被认为是BACKSLASH其中BACKSLASH = r"\\"[0]在程序的开始.另一个kludge.
更新:
当原始字符串末尾有一个奇数个反斜杠时,也会发生此错误.使用的默认字符串扫描程序将反斜杠解释为转义字符,以便最后一个反斜杠将转义结束引号字符.它的目的是"并且'可以嵌入到字符串中,但是生成的字符串仍然会将内部的反斜杠作为普通字符.
有几个与此问题相关的问题,但没有一个答案解释了为什么单个反斜杠原始字符串是错误或如何将单个反斜杠编码为原始字符串:
我需要在复杂的字符串\\中用\python3 替换.我知道这个问题已被多次询问过,但大部分时间都是针对简单的字符串,所以(接受的)答案都不适用于复杂的字符串.
这也是不同的,从这个地方的问题可以用来解决.decode('unicode_escape')这对于这个问题无法正常工作.见下文.
假设字符串是:
my_str = '\\xa5\\xc0\\xe6aK\\xf9\\x80\\xb1\\xc8*\x01\x12$\\xfbp\x1e(4\\xd6{;Z\\x'
Run Code Online (Sandbox Code Playgroud)
直接的方法是:
my_str.replace('\\','\')
Run Code Online (Sandbox Code Playgroud)
这导致:
SyntaxError:扫描字符串文字时的EOL
这个答案建议使用:
my_str.replace('\\\\','\\')
Run Code Online (Sandbox Code Playgroud)
结果如下:
'\\xa5\\xc0\\xe6aK\\xf9\\x80\\xb1\\xc8*\x01\x12$\\xfbp\x1e(4\\xd6{;Z\\x'
Run Code Online (Sandbox Code Playgroud)
所以,没有变化.
这个答案表明:
b = bytes(my_str, encoding='utf-8')
b.decode('unicode-escape')
Run Code Online (Sandbox Code Playgroud)
但是这对于这样一个复杂的字符串不起作用:
UnicodeDecodeError:'unicodeescape'编解码器无法解码位置49-50中的字节:截断\ xXX转义
使用解码(如此处所示)会导致:
my_str.decode('unicode_escape')
Run Code Online (Sandbox Code Playgroud)
AttributeError:'my_str'对象没有属性'decode'
编码和解码的组合使用unicode_esacpe返回一个完全不同的字符串(可能是由于使用utf-16,但utf-8导致错误,见上文.另外,例如latin1,不起作用):
my_str.encode('utf-16').decode('unicode_escape')
'ÿþ\\\x00x\x00a\x005\x00\\\x00x\x00c\x000\x00\\\x00x\x00e\x006\x00a\x00K\x00\\\x00x\x00f\x009\x00\\\x00x\x008\x000\x00\\\x00x\x00b\x001\x00\\\x00x\x00c\x008\x00*\x00\x01\x00\x12\x00$\x00\\\x00x\x00f\x00b\x00p\x00\x1e\x00(\x004\x00\\\x00x\x00d\x006\x00{\x00;\x00Z\x00\\\x00x\x00'
Run Code Online (Sandbox Code Playgroud)