【问题标题】:How do I remove a substring from text based on a partial match in Python?如何根据 Python 中的部分匹配从文本中删除子字符串?
【发布时间】:2019-08-04 21:15:57
【问题描述】:

我有一个很长的文本块,其中包含我想要根据部分匹配 (90%) 删除的潜台词。

string = "Adam is a boy who lives in Michigan.  
        He loves to eat apples and oranges. 
        He also enjoys playing with his dog and cat. 
        Adam is a happy boy."

substring = "He loves to apple oranges"

我想回来

"Adam is a boy who lives in Michigan.  
 He also enjoys playing with his dog and cat. 
 Adam is a happy boy."

子字符串中没有出现“吃”和“和”这两个词,但我想删除整个句子“他喜欢吃苹果和橙子”。我真的不知道该怎么做。谢谢!

【问题讨论】:

    标签: python text data-cleaning


    【解决方案1】:
    string = string.replace(substring,'')
    

    这会将字符串中的子字符串替换为空(""

    【讨论】:

    • 只有当子字符串与我要删除的句子完全匹配时才有效?在示例中,我想删除整个句子“他喜欢吃苹果和橙子”,但“吃”和“和”这两个词没有出现在我的子字符串中。
    • 是的,没错。抱歉——我以为那是你的意图。这是一个更深层次的问题,那么
    【解决方案2】:

    你可以使用difflib.SequenceMatcher:

    from difflib import SequenceMatcher
    '\n'.join(s for s in string.splitlines() if SequenceMatcher(' '.__eq__, s, substring).ratio() < 0.6)
    

    这会返回:

    Adam is a boy who lives in Michigan.
    He also enjoys playing with his dog and cat.
    Adam is a happy boy.
    

    演示:https://ideone.com/twDu1r

    【讨论】:

    • 不错,我刚刚试过,效果很好。我以前不知道这个库。很酷的东西。
    • 谢谢!只是一个跟进,如果文本不在不同的行并且只是一个长字符串,你会怎么做?
    • @Rachel 很高兴能帮上忙。您能否提供一个示例输入和预期输出,以通过过滤掉长行中子字符串的部分匹配来阐明您的意思?
    • @Rachel 我明白了。我想您可以使用句点 . 作为句子结尾的标记,在这种情况下使用 re.findall(r'\S.*?\.', string) 而不是 string.splitlines()
    • @blhsing 例如,如果 string = "string = "Adam 是一个住在密歇根州的男孩。他喜欢吃苹果和橘子。他还喜欢和他的狗和猫一起玩。亚当是一个快乐的男孩。”和子字符串 =“他喜欢吃苹果橘子”。我想返回“亚当是一个住在密歇根州的男孩。他还喜欢和他的狗和猫一起玩。亚当是一个快乐的男孩。”所以,基本上,不使用 string.splitlines()。
    猜你喜欢
    • 2012-03-12
    • 2020-03-27
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 2022-12-06
    相关资源
    最近更新 更多