4

我有一组从文件中读取的字符串 say ['\x1\p1', '\x2\p2', '\x3\p3', ... etc.].

当我将它们读入变量并打印它们时,字符串显示为 ['\\x1\\p1', '\\x2\\p2', '\\x3\\p3', ... etc.]. 我知道该变量在'\x1\p1', ... etc.内部表示,但是当它显示时,它以双斜杠显示。

但是现在我想在句子中搜索和替换这个列表的元素,即说如果\x1\p1在句子中"How are you doing \x1\p1"然后替换'\x1\p1'为'Y'。但是在这种情况下替换方法不起作用!想知道为什么?

让我进一步解释一下:我的文本文件 ( codes.txt) 有条目\xs1\x32\xs2\x54由换行符分隔。所以当我阅读它时

with open('codes') as codes:
    code_list = codes.readlines()

接下来,我确实可以说code_list_element_1 = code_list[1].rstrip()

当我打印时code_list_element_1,它显示为'\\xs1\\x32'

接下来,让我的目标字符串是target_string = 'Hi! my name is \xs1\x32'

现在我想用say替换code_list_element_1应该\xs1\x32在target_string中的'Y'

所以,我试过了code_list_element_1 in target_string。我明白了False

接下来,我没有从文本文件中读取代码,而是初始化了一个变量find_me = '\xs1\x32'

现在,我试试find_me in target_string。我明白了True

并因此target_string.replace(find_me,"Y")显示我想要的:"Hi! my name is Y"

4

2 回答 2

5

您正在查看可以粘贴回 Python 的字符串表示形式;反斜杠加倍以确保值不会被解释为转义序列(例如\n,表示换行符,或\xfe表示值为 254 的字节,十六进制 FE)。

如果您正在构建新的字符串值,您还需要使用那些双反斜杠来防止 Python 在没有转义序列的情况下看到转义序列,或者使用原始字符串文字:

>>> '\\x1\\p1'
'\\x1\\p1'
>>> r'\x1\p1'
'\\x1\\p1'

对于这个特定示例,不正确处理反斜杠实际上会导致异常:

>>> '\x1\p1'
ValueError: invalid \x escape

\x因为 Python 期望在转义后找到两个十六进制数字。

于 2013-10-29T18:04:05.327 回答
3

原始字符串(以 为前缀的字符串r对于反斜杠非常有用。

In [9]: a=r"How are you doing \x1\p1"

In [10]: a
Out[10]: 'How are you doing \\x1\\p1'

In [11]: a.replace(r'\x1\p1', 'Y')
Out[11]: 'How are you doing Y'

In [12]: 
于 2013-10-29T18:04:46.857 回答