【问题标题】:Remove '\x' from string in a text file in Python从 Python 中的文本文件中的字符串中删除 '\x'
【发布时间】:2018-03-21 05:35:38
【问题描述】:

这是我第一次在 Stack 上发帖。如果有人可以帮助我,我将不胜感激。

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

10\x3a00\x3a00

最终的输出应该是:

100000

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

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

其中“a”是文本文件的一行。

当我尝试这样做时,我收到一条错误消息“invalid \x escape”。

我已经为此苦苦挣扎了好几个小时。我的正则表达式有什么问题?

【问题讨论】:

标签: python-2.7


【解决方案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 字符,则将ord(x) &lt; 127 中的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'

【讨论】:

    【解决方案2】:

    试试这个

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

    用你的字符串改变 myText

    【讨论】:

    • 这里我尝试删除它们,但您可以随意更改 ''
    猜你喜欢
    • 2014-12-19
    • 2019-12-27
    • 2021-12-04
    • 2013-08-08
    • 2022-01-16
    • 2019-02-18
    • 2020-10-13
    • 2018-12-04
    相关资源
    最近更新 更多