【问题标题】:Python: search and replace - string delineation issuePython:搜索和替换 - 字符串描述问题
【发布时间】:2015-01-26 14:53:29
【问题描述】:

尝试查找和替换字符串列表(由新行分隔),例如

aba
abanga
abaptiston
abarelix

有一个类似的列表

aba
aca
ada

这样,如果第二个列表中的项目出现在第一个列表中,则应将其删除。

我有一半工作的代码

def replace_all(text, dic):
    for i, j in dic.iteritems():
        text = text.replace(i, j)
    return text

with open("words.txt", "r") as f:
    content = f.readlines()

str = ''.join(str(e) for e in content)  #list may include numbers

delet = {"aba":"", "aca":"", "ada":"",}
txt = replace_all(str, delet)

f = open("deltedwords.txt","w") 
f.write(txt)

不幸的是,这会捕获部分字符串的误报,因此最终结果将是

nga
ptiston
relix

试图在被搜索的词之前添加空格或其他字符是行不通的,因为它往往只会产生假阴性。

【问题讨论】:

  • 你能添加预期的输出吗?
  • @C.B.预期的输出将与第一个列表完全相同,只是删除了“aba”(即第一个条目)
  • 您会一直完全删除行,还是也想进行实际替换?前任。 "abarelix 应该变成 QQQQ"

标签: python string python-2.7 search


【解决方案1】:

您可以简单地过滤,但我认为如果您只是删除条目,则不需要字典。

如果顺序无关紧要,请使用set

>>> content = set(['aba', 'abanga', 'abaptiston', 'abarelix'])
>>> unwanted_words = set(['aba', 'aca', 'ada'])
>>> content.difference(unwanted_words)
set(['abanga', 'abarelix', 'abaptiston'])

如果是这样,只需使用列表推导

>>> content = ['aba', 'abanga', 'abaptiston', 'abarelix']
>>> unwanted_words = ['aba', 'aca', 'ada']
>>> [word for word in content if word not in unwanted_words]
['abanga', 'abaptiston', 'abarelix']

【讨论】:

    【解决方案2】:

    如何使用:

    content_without_keywords = filter(lambda x: x.strip() not in delet.keys(), content)
    txt = ''.join(str(e) for e in content_without_keywords)
    

    只删除完全匹配的行。

    【讨论】:

    • 我的回答思路与@C.B.的第二个代码基本相同,仅供参考。
    • 当然,我的回答只是对您的确切代码的直接回答,请在您正确后整理代码。 (例如,delet 不需要是 dict )
    猜你喜欢
    • 2010-11-14
    • 2023-04-06
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    相关资源
    最近更新 更多