从Python中的文本文件中删除字符串中的'\ x'

时间:2017-10-09 22:46:46

标签: python-2.7

这是我第一次在Stack上发帖。如果有人能帮助我,我真的很感激。

我正在尝试从包含以下内容的文本文件中删除Unicode字符(在我的情况下为\x3a):

10\x3a00\x3a00

最终输出应该是:

100000

基本上,我们被指示删除\xXX的所有痕迹,其中X可以是以下任何一种:0123456789ABCDEF。我尝试使用如下的正则表达式来删除任何\xXX

Re.sub(‘\\\x[a-fA-F0-9]{2}’,””, a)

a”是文本文件的一行。

当我尝试这样做时,我收到错误提示“invalid \x escape”。

我几个小时都在苦苦挣扎。我的正则表达式出了什么问题?

2 个答案:

答案 0 :(得分:1)

字符"\x3a"不是多字节Unicode字符。它是ASCII字符":"。一旦指定了字符串"\x3a",它就会在内部存储为字符":"。 Python没有看到任何"\"动作发生。所以你不能将"\x3a"剥离为多字节Unicode,因为Python只看到单字节ASCII字符":"

$ python
>>> '\x3a' == ':'
True
>>> "10\x3a00\x3a00" == "10:00:00"
True

查看关于UTF-8的维基百科文章的描述部分。请参阅U+0000-U+007F范围内的字符编码为单个ASCII字符。

如果要删除非ASCII字符,请执行以下操作:

>>> print u'R\xe9n\xe9'
Réné
>>> ''.join([x for x in u'R\xe9n\xe9' if ord(x) < 127])
u'Rn'
>>> ''.join([x for x in 'Réné' if ord(x) < 127])
'Rn'

如果您想保留欧洲字符但丢弃具有更高代码点的Unicode字符,请将127中的ord(x) < 127更改为更高的值。

帖子replace 3 byte unicode有另一种方法。您还可以使用以下方法删除代码点范围:

>>> str = u'[\uE000-\uFFFF]'
>>> len(str)
5
>>> import re
>>> pattern = re.compile(u'[\uE000-\uFFFF]', re.UNICODE)
>>> pattern.sub('?', u'ab\uFFFDcd')
u'ab?cd'

请注意,使用\u可能比使用\x指定字符更容易。

另一方面,您可以使用可以删除的字符串"\\x3a"。当然,该字符串实际上不是一个多字节的Unicode字符,而是4个ASCII字符。

$ python
>>> print '\\x3a'
\x3a
>>> '\\x3a' == ':'
False
>>> '\\x3a' == '\\' + 'x3a'
True
>>> (len('\x3a'), len('\\x3a'))
(1, 4)

您还可以删除ASCII字符":"

>>> "10:00:00".replace(":", "")
'100000'
>>> "10\x3a00\x3a00".replace(":", "")
'100000'
>>> "10\x3a00\x3a00".replace("\x3a", "")
'100000'

答案 1 :(得分:0)

尝试

import re
tagRe = re.compile(r'\\x.*?(2)')
normalText = tagRe.sub('', myText)

用您的字符串更改myText