【问题标题】:Python Search and Replace Using a List for SearchPython 使用列表进行搜索和替换
【发布时间】:2022-01-13 21:26:47
【问题描述】:

我有几行文件正在循环并存储为字符串,我希望使用 python 字符串 str.replace() 中内置的方法或使用常规方法在每一行中执行简单的搜索和替换表达式re.sub(),但使用列表作为旧子字符串的参数。我知道格式通常如下:

string.replace('oldsubstring','newsubstring')

但是,如果我有一个字符串列表:['word1', 'word2', 'word3'],是否可以将其用作 oldsubstring 参数,以便如果列表中的 任何 元素在 @ 中找到987654326@,该元素被替换为newsubstring。我知道这可以使用一个双嵌套的 for 循环来循环我的所有行和我的字符串列表,但我正在寻找一种更有效的算法来实现这一点。

后续问题:

我发现的另一个问题是有时我的字符串列表看起来像:

['word1', 'word1_suffix', 'word2', 'word3'] 注意:这些元素的顺序不保证每次运行都相同。

当使用双重嵌套for循环方法时,如果word1_suffix出现在我正在查看的当前行中,然后我循环遍历我的字符串列表,如果word1恰好出现在我的字符串列表中,替换将是newsubstring_suffix,而不是将整个子字符串:word1_suffix替换为newsubstring

注意:我知道使用正则表达式可以确保 word1_suffix 是由空格包围的完整单词,但有时我确实希望我的行的一部分遵循以下格式:word1_miscellaneous替换为newsubstring_miscellaneous,这样这种方法就不能完全解决我的问题。

【问题讨论】:

    标签: python regex string list replace


    【解决方案1】:

    使用re.sub,您可以使用正则表达式的贪婪字符来确保word1_suffix 不会被newsubstring_suffix 替换:

    your_string = "hello word1_suffix world word3"
    
    word_list = ['word1', 'word1_suffix', 'word2', 'word3']
    word_set = set(word_list)
    
    # pattern to match all 'words' (succession of letters, digits and _):
    word_pattern = re.compile(r'\w+')
    print(re.sub(word_pattern, lambda x: "newsubstring" if x.group() in word_set else x.group(), your_string))
    

    lambda 函数检查匹配的组是否在word_set 中,并将其替换为newsubstring

    输出:

    hello newsubstring world newsubstring
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-13
      • 1970-01-01
      相关资源
      最近更新 更多