当需要用python替换字符串时,如何有效地避免替换子字符串?

当需要用python替换字符串时,如何有效地避免替换子字符串?,python,string,pandas,replace,substring,Python,String,Pandas,Replace,Substring,我想用它们的链接更新单词/短语 然而,由于单词短语可能是其他单词短语的子字符串,因此我正在寻找一种有效的方法来替换所有单词/短语,而无需重复替换 替代列表 例如:以下单词/短语需要在“>>”之后替换为相应的标记链接: ABC苹果>>[ABC苹果](http://abc_apple) ABC苹果>>[ABC苹果](http://abc_apples) 苹果>[苹果](http://apple) 苹果>>[苹果](http://apples) 苹果派>>[苹果派](http://apple_pie)

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

然而,由于单词短语可能是其他单词短语的子字符串,因此我正在寻找一种有效的方法来替换所有单词/短语,而无需重复替换

替代列表

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

  • ABC苹果>>
    [ABC苹果](http://abc_apple)
  • ABC苹果>>
    [ABC苹果](http://abc_apples)
  • 苹果>
    [苹果](http://apple)
  • 苹果>>
    [苹果](http://apples)
  • 苹果派>>
    [苹果派](http://apple_pie)
  • 红苹果>>
    [红苹果](http://red_apple)
  • 红苹果派>>
    [红苹果派](http://red_apple_pie)
  • 创意

    当我们有一个数据结构,即每个单词/短语(子字符串)存储包含它们的单词/短语(字符串)(比如列表),我们可以先检查句子是否包含列表中的元素,然后再检查它是否包含子字符串

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

    • ABC苹果:{ABC苹果}
    • ABC苹果:{}
    • 苹果:{ABC苹果,ABC苹果,苹果,苹果派,红苹果,红苹果派}
    • 苹果:{}
    • 苹果派:{红苹果派}
    • 红苹果:{红苹果派}
    • 红苹果派:{}
    然而,计算工作将非常安静,因为列表中的每个元素,我们仍然需要检查该元素的列表

    示例

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

  • “我喜欢苹果派。”:红苹果派(x)>>红苹果派(x)>>苹果派(o)>>红苹果派(x)
  • “我喜欢ABC苹果!”:红苹果派(x)>>红苹果(x)>>苹果派(x)>>苹果(x)>>苹果(o)>>红苹果派(x)>>红苹果派(x)>>苹果派(x)>>红苹果派(x)>>苹果(x)>>ABC苹果(x)>>ABC苹果(o)>>ABC苹果(x)
  • 计算工作量O(n^3) 句子长度x替换列表长度x列表长度

    (原句>>结果句:)

    预期结果

    "I like ABC Apple!"` >> `"I like [ABC Apple](http://abc_apple)!"
    
    "I like ABC Apple!"` >> `"I like ABC [Apple](http://apple)!"
    
    错误结果

    "I like ABC Apple!"` >> `"I like [ABC Apple](http://abc_apple)!"
    
    "I like ABC Apple!"` >> `"I like ABC [Apple](http://apple)!"
    
    有一个贪婪的朴素O(MN+MlogM)解(N个大小的字符串和M个大小的所有替换)

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

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

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

    有一个贪婪的天真O(MN+MlogM)解决方案(N个字符串大小和M个所有替换大小)

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

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

    你按顺序搜索的事实应该解决(如果我理解得很好的话)你的问题
    为了在开发过程中保持上述复杂性,您可能需要一些技巧来避免阅读“已完成的替换”,但这应该不会太难

    最后,我认为使用一些数据结构可以找到时间复杂度更低的解决方案,但实现起来更困难

    显而易见的方法不起作用吗?从最长到最短处理替换列表。明显的不起作用吗?从最长到最短处理替换列表。