在Python中提取部分长字符串的最快方法

时间:2016-01-06 02:20:32

标签: python string performance parsing

我有很多字符串,我希望提取每个字符串的某个部分。每个字符串都包含一个子字符串,如下所示:

my_token:[
  "key_of_interest"
],

这是每个字符串中唯一标有my_token的部分。我正在考虑获取'my_token:[“'的结束索引位置,然后获取'”的起始索引位置,“并获取这两个索引位置之间的所有文本。

有更好或更有效的方法吗?我会做这个长度为~10,000的字符串和大小为100,000的字符串。

编辑:该文件是.ion文件。根据我的理解,它可以被视为一个平面文件 - 因为它是基于文本的,用于描述元数据。

3 个答案:

答案 0 :(得分:1)

当您澄清时,基本要求会显示出来:

  

我正在考虑获得'的结束指数位置。 my_token:[" '然后获得'的开始索引位置"],'并获得这两个索引位置之间的所有文本。

听起来你正试图避免使用正确的方法:使用解析器来处理字符串中的任何语言。

没有充分的理由直接在字符串基元之上构建解析,除非您有兴趣编写yet another parsing framework

因此,请使用由您处理过问题的人员编写的库。

  • 如果是JSON,请使用standard library json module;同上,如果它是Python标准库中已有解析器的其他语言。
  • 如果它是其他一些广泛实施的标准:获取已经存在的第三方Python库知道如何正确解析它。
  • 如果尚未实现:使用pyparsing或其他一些着名的实体库编写自定义解析器。

所以要做出一个好的选择,你需要知道什么是数据格式(这不是“文件名是什么”的答案;相反,你需要知道什么是数据格式这些文件的内容)。然后,您将能够搜索知道该数据格式的解析器库。

答案 1 :(得分:1)

如何以最简单最简单的方式完成这项工作"?

  • 找到起始位置
  • 查看结束位置
  • 在两个
  • 之间不分青红皂白地抓取所有内容

这确实是你正在做的事情。因此,任何进一步的改进只能来自每个步骤的优化。可能的方式包括:

  • 缩小搜索范围(根据comment56995056需要额外的约束/假设)
  • 加快搜索操作位,包括:
    • 从格式中提取原始数据
      • 你已经完全忽略了这种格式 - 所以你必须确保永远不会有任何不正确的解析(例如你的搜索术语嵌入其他地方的字符串或匹配部分令牌){{{ 3}}
    • 基本模式比较操作
      • 不太可能在纯Python中实现,因为已经在C中实现str.index并且实现可能已经很简单了

答案 2 :(得分:0)

好吧,正如已经提到的 - 解析器似乎是最好的选择。

但是在没有所有额外建议的情况下回答你的问题......如果你只是看速度,解析器并不是最好的方法。更快的方法是你已经有一个这样的字符串就是使用正则表达式。

matches = re.match(r"my_token:\[\s*"(.*)"\s*\]\.",str)
key_of_interest = matches.groups()[0]

还有其他问题出现。例如,如果你的密钥里面有"怎么办? strinified JSON将自动在那里使用转义字符,这也将由正则表达式捕获。因此,这有点太复杂了。

JSON本身不是正则表达式可解析的(is-json-a-regular-language)。因此,使用风险自负。但是,通过适当的限制和假设,regex将比json解析器更快。