使用正则表达式

时间:2017-04-11 08:20:29

标签: python json regex unicode

我有一个JSON文件,用于存储名为stream_key.json的文本数据:

{"text":"RT @WBali: Ideas for easter? Digging in with Seminyak\u2019s best beachfront view? \nRSVP: b&f.wbali@whotels.com https:\/\/t.co\/fRoAanOkyC"}

正如我们可以看到json文件中的文本包含unicode \u2019,我想在Python 2.7中使用regex删除此代码,这是我目前为止的代码(eraseunicode.py):

import re
import json

def removeunicode(text):
    text = re.sub(r'\\[u]\S\S\S\S[s]', "", text)
    text = re.sub(r'\\[u]\S\S\S\S', "", text)
    return text

with open('stream_key.json', 'r') as f:
    for line in f:
        tweet = json.loads(line)
        text = tweet['text']
        text = removeunicode(text)
        print(text)

我得到的结果是:

Traceback (most recent call last):
  File "eraseunicode.py", line 17, in <module>
    print(text)
  File "C:\Python27\lib\encodings\cp437.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character u'\u2019' in position 53: character maps to <undefined>

由于我已经使用函数在打印前删除\u2019,我不明白为什么它仍然是错误。请帮忙。感谢

1 个答案:

答案 0 :(得分:1)

当数据在文本文件中时,\u2019是一个字符串。但是一旦加载到json,它就变成了unicode,替换不再起作用了。

所以你必须在加载到json之前应用正则表达式并且它可以正常工作

tweet = json.loads(removeunicode(line))

当然它处理整个原始线。你也可以通过检查这样的字符代码从解码的text中删除非ascii字符(注意它不是严格等同的):

 text = "".join([x for x in tweet['text'] if ord(x)<128])