我拿出一些推文进行分析。当我将推文中的单词分开时,我可以在输出中看到很多以下表达式:
\xe3\x81\x86\xe3\x81\xa1
我想使用正则表达式来替换这些模式。我对正则表达式不太满意。我尝试在一些类似的问题中使用解决方案,但没有任何对我有用他们正在从"xt"
替换"extra"
等字符。
我正在寻找能够取代\x??
的东西,考虑??
可以是a
- f
或0
- {{1}但是单词必须是4个字母,以9
开头。
此外,我想为字母以外的任何内容添加替换。像:
\x
替换后应该产生
"Hi!! my number is (7097868709809)."
输入:
"Hi my number is."
需要输出:
\xe3\x81\x86\xe3Extra
答案 0 :(得分:1)
您所看到的是无法直接打印的Unicode字符,表示为十六进制数字对。所以对于一个更可打印的例子:
>>> ord('a')
97
>>> hex(97)
'0x61'
>>> "\x61"
'a'
请注意,似乎是四个字符'\x61'
的序列评估为单个字符'a'
。因此:
??
可以"成为" - 它们可以是'0'
- '9'
或'a'
- 'f'
;和r'\\x[0-9a-f]{2}'
会与您看到的序列匹配,不是正则表达式会解析的 - 每个" word"是一个单一的角色。您可以使用以下字符删除字符"而不是字母" string.printable
:
>>> s = "foo\xe3\x81"
>>> s
'foo\xe3\x81'
>>> import string
>>> valid_chars = set(string.printable)
>>> "".join([c for c in s if c in valid_chars])
'foo'
请注意,例如'\xe3'
可以直接打印在Python 3中(它是'ã'
),但不包含在string.printable
中。有关Python中Unicode的更多信息,请参阅the docs。