使用Python Replace()和JSON对象

时间:2014-01-21 19:24:39

标签: python json replace

所以,我有一个JSON对象,包含我正在阅读的多条Facebook消息。在消息对象中,我调用替换几次以删除\ n并更改时间戳,如下所示。

messages = ([msg['created_time'].replace('T', ' ').replace('+0000', ''), msg.get('message', 'Key "message" is not present.').replace('\n', ' ').encode('utf8'),  msg['from']['id']] for msg in js.get('data', []))

我现在有一个完整的单词列表,我希望从消息文本中删除;但是,我不想将对象分开,所以替换似乎是一个不错的选择。我试图将所有单词放在这样的列表中:

 ignore = ["you","all","has","can","that", "the", "what", "with", "and", "to", "this", "would","from", "your", "which", "while", "these", "when", "way", "like", "been", "will", "look"]

我不能只将这个插入到替换中的第一个参数中,因为我需要对忽略替换中的每个单词有一些感觉......

有人有任何建议吗?我可以使用缓冲区并将整个缓冲区提供给替换吗?我可以使用不同的方法吗?我是否需要替换每个单词(这看起来很草率)?

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:0)

  

我不能只将这个插入到替换中的第一个参数中,因为我需要对忽略替换中的每个单词有一些感觉......

不,但你可以编写一个简单的函数来链接一堆.replace个调用:

def replaceall(s, olds, replacement):
    for old in olds:
        s = s.replace(old, replacement)
    return s

使用正则表达式可能会更有效地完成。如果在执行多个replace调用时遇到重大性能问题,那么现在是学习regexp基础知识的好时机。如果没有,请不要担心。

基本思想 - 如果您确定没有替换字符串中没有任何正则表达式特殊字符,那么它将会起作用 - 就像这样:

rignore = re.compile('|'.join(ignore))
def ignoreall(s):
    return rignore.sub(s, '')

除了这样的情况更快,regexp还具有更强大的优势。如果你以后决定只想替换完整的单词(对于“单词”的一些好的定义),这将是一个相对容易的变化。如果你想要处理当左边界是一个空格时删除前面的空格,再次,并不难。


  

我可以使用缓冲区并将整个缓冲区提供给替换吗?

是的,但这会变得困难,因为要替换的单词总是可以跨越一个缓冲区的边界到另一个缓冲区,这意味着它们不会在任何一个缓冲区中。如果你的所有替换字符串都有一些独特的边界,比如空格或任何非字母或其他东西,你可以拆分缓冲区的最后一部分并保持它直到下一个缓冲区,然后一次做一个缓冲区将工作

这是否是一个有用的优化是你必须要衡量的 - 或者,如果一切都足够快,不要打扰。但它肯定不会简化事情。

但是,如果你有一个具有良好边界的“整体”,你可以一次读入内存并处理所有内容,而不是逐个缓冲区或缓冲区(这可能适用于您的用例,也可能不适用) ),然后它简化事情,并可能加速它们(以使用更多内存为代价,并推迟任何处理直到“整件事情”可用,这可能会或可能不会花费比你节省的更多。)