【问题标题】:How to efficiently avoid replacing a substring when there are string necessary to be replaced with python pandas?当需要用python pandas替换字符串时,如何有效地避免替换子字符串?
【发布时间】:2019-12-15 00:33:39
【问题描述】:

我想用他们的链接更新单词/短语。

但是,由于词组可能是其他词的子字符串,因此我正在寻找一种有效的方法来替换所有词/词组而不会重复替换。

替补名单

a 的示例:以下单词/短语需要在“>>”之后替换为相应的 markdown 链接:

  1. ABC苹果>>[ABC Apple](http://abc_apple)
  2. ABC 苹果 >> [ABC Apples](http://abc_apples)
  3. 苹果>>[Apple](http://apple)
  4. 苹果>>[Apples](http://apples)
  5. 苹果派>>[Apple Pie](http://apple_pie)
  6. 红苹果>>[Red Apple](http://red_apple)
  7. 红苹果派>>[Red Apple Pie](http://red_apple_pie)

想法

如果我们有一个数据结构,每个单词/短语(子字符串)存储包含它们的单词/短语(字符串)(例如 list_l),我们可以在检查句子是否包含子字符串之前检查句子是否包含 list_l 中的元素

例如,现在我们有以下子字符串:{list_l(string)}

  • ABC 苹果:{ABC 苹果}
  • ABC 苹果:{}
  • 苹果:{ABC 苹果,ABC 苹果,苹果,苹果派,红苹果,红苹果派}
  • 苹果:{}
  • 苹果派:{红苹果派}
  • 红苹果:{红苹果派}
  • 红苹果派:{}

但是,计算工作会很安静,因为 list_l 中的每个元素,我们仍然需要检查该元素的 list_l。

示例

一些要替换的句子作为例子(从后面走过):

  1. “我爱苹果派。”:红苹果派(x) >> 红苹果派(x) >> 苹果派(o) >> 红苹果派(x)
  2. “我喜欢ABC苹果!”:红苹果派(x)>>红苹果派(x)>>苹果(x)>>苹果(o)>>红苹果派(x) ) >> 红苹果(x) >> 红苹果派(x) >> 苹果派(x) >> 红苹果派(x) >> 苹果(x) >> ABC 苹果(x) >> ABC 苹果(o ) >> ABC 苹果(x)

计算量 O(n^3) 句子长度 x 替换列表长度 x list_l 长度

(原句>>结果句:)

预期结果

"I like ABC Apple!"` >> `"I like [ABC Apple](http://abc_apple)!"

错误的结果

"I like ABC Apple!"` >> `"I like ABC [Apple](http://apple)!"

【问题讨论】:

  • 显而易见的行不通吗?处理从最长到最短的替换列表。

标签: python string pandas replace substring


【解决方案1】:

有一个贪婪的朴素 O(MN + MlogM) 解决方案(字符串大小为 N,所有替换大小为 M)。

第一段是按长度(O(MlogM))对可能的替换进行排序。

然后你在原始句子中搜索一个替换,如果找到你做替换(O(N))。您需要为每次替换按顺序执行此操作; O(MN)也是如此

您按顺序搜索的事实应该可以解决(如果我理解良好的话)您的问题。
为了在开发中保持上述复杂性,您可能需要一些技巧来不阅读“已经替换”,但这应该不会太难。
最后,我认为可以使用一些数据结构来解决时间复杂度较低的解决方案,但实现起来更加困难

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-26
    • 2014-05-18
    • 2014-06-09
    • 2016-11-28
    • 2020-08-27
    相关资源
    最近更新 更多