如何清理具有特定但不同长度模式的推文?

时间:2014-07-15 09:21:57

标签: python regex twitter

我拿出一些推文进行分析。当我将推文中的单词分开时,我可以在输出中看到很多以下表达式:

\xe3\x81\x86\xe3\x81\xa1

我想使用正则表达式来替换这些模式。我对正则表达式不太满意。我尝试在一些类似的问题中使用解决方案,但没有任何对我有用他们正在从"xt"替换"extra"等字符。

我正在寻找能够取代\x??的东西,考虑??可以是a - f0 - {{1}但是单词必须是4个字母,以9开头。

此外,我想为字母以外的任何内容添加替换。像:

\x

替换后应该产生

"Hi!! my number is (7097868709809)." 

输入:

"Hi my number is."

需要输出:

\xe3\x81\x86\xe3Extra

1 个答案:

答案 0 :(得分:1)

您所看到的是无法直接打印的Unicode字符,表示为十六进制数字对。所以对于一个更可打印的例子:

>>> ord('a')
97
>>> hex(97)
'0x61'
>>> "\x61"
'a' 

请注意,似乎是四个字符'\x61'的序列评估为单个字符'a'。因此:

  1. ??可以"成为" - 它们可以是'0' - '9''a' - 'f';和
  2. 虽然例如r'\\x[0-9a-f]{2}'会与您看到的序列匹配,不是正则表达式会解析的 - 每个" word"是一个单一的角色。
  3. 您可以使用以下字符删除字符"而不是字母" 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