我在Python 3中有一个普通字符串'бекслеш \018 на точку'
。我从外部HTML页面获取了这个字符串,因此它没有" r"原始字符串的前缀。我不知道如何将其转换为原始字符串。
如何将'\'
替换为点'.'
?
我尝试过以下方法:
s = get_string() # 'бекслеш \018 на точку'
print(s.replace('\\', '.'))
out: бекслеш 8 на точку
但我需要'бекслеш .018 на точку'
。
UPD:很明显,编程语言将反斜杠解释为控制字符。 问题:如果不能将字符串指定为raw,或者不清楚如何将其转换为raw,如何进行替换?
答案 0 :(得分:3)
字符串文字与原始字符串之间的区别在于它们被解释为从源代码创建字符串对象的方式。他们创造的对象在任何方面都没有区别。所以没有将字符串转换为原始字符串的事情。
在这种情况下,'\018'
代表'\x01'
,即标题起始字符,后跟字符'8'
。
chr(1) + '8' == '\x018' # True
正如您所看到的,您的字符串不包含'\\'
字符。
'\\' in 'бекслеш \018 на точку' # False
答案 1 :(得分:2)
我认为你实际上想要替换控制字符:
<强>代码强>
print(s.replace("\x01", ".01"))
# бекслеш .018 на точку
<强>详情
很明显,编程语言将反斜杠解释为控制字符。
实际上,控制字符包括转义字符(\
)和相邻代码(01
)。让我们看看Python如何看待每个角色:
print(list(s))
# ['б', 'е', 'к', 'с', 'л', 'е', 'ш', ' ', '\x01', '8', ' ', 'н', 'а', ' ', 'т', 'о', 'ч', 'к', 'у']
注意\x01
是一个字符,而不是单独的反斜杠。你必须替换整个角色。
<强>附录强>
因此,一般方法可以迭代每个字符,并用新字符串替换属于control character category的任何字符。应该格式化此新字符串以镜像它替换的字符的值。否则,返回正常字符。
from unicodedata import category
"".join(".{:02d}".format(ord(char)) if category(char).startswith("C") else char for char in s)
# 'бекслеш .018 на точку'