首页 > 解决方案 > 如何根据一组多对模式中两个模式的共现来修剪字符串?

问题描述

我有一个输入字符串列表和一个元组列表,每个元组包含一对字符串模式:

list_strings=["ABC","ABCDEF","CDEFGH","AB","CDEFGHIJK","DEFGHIJKLMNO"]
list_patterns=[("A","C"),("CDE","JK"),("EF","MNO")

我想要做的基本上是从list_strings他们找到任何模式的位置切断字符串list_patterns。因此,对于每个字符串,我想检索list_patterns列表中任何元组的第一个和第二个成员之间的字符。

我使用哪些模式元组来剪切字符串并不重要,我只想保留每个元组的第一个和第二个成员之间的内容(修剪过的字符串)。

输出字符串将包含使用第一个匹配模式获得的修剪后的字符串;如果没有匹配的模式,原始字符串将被保留。此外,我还想创建一个包含已成功修剪的字符串的列表。

我的输出将是这样的:

list_containing_all_strings=["B","B","CDEFGH","AB","FGHI","GHIJKL"]
list_containing_successful_trims=["B","B","FGHI","GHIJKL"]

标签: pythonstringlist

解决方案


我只会遍历列表元素。对于它们中的每一个,我都会尝试搜索修剪模式,直到找到其中一个:

input_list=["ABC","ABCDEF","CDEFGH","AB","CDEFGHIJK","DEFGHIJKLMNO"]
list_patterns=[("A","C"),("CDE","JK"),("EF","MNO")]

output_list = []
trimmed_list = []

for el in input_list:
    for pat in list_patterns:
        beg = el.find(pat[0])
        end = el.rfind(pat[1])
        if(beg != -1 and end != -1):
            trimmed_list.append(el[beg+len(pat[0]):end])
            output_list.append(el[beg+len(pat[0]):end])
            break
    else:
        output_list.append(el)
        
print(output_list)
print(trimmed_list)
  • output_list和最初都是trimmed_list空的。
  • 对于每个元素模式,执行起始模式的直接搜索(find()on pat[0])和结束模式的反向搜索(rfind()on pat[1]
  • 仅当它们都已找到时(检查 -1)将原始字符串的正确字符串切片output_list附加到andtrimmed_listbreak
  • 对于每个元素,只要找不到模式 ( else),就将原始字符串附加到output_list

输出:

['B', 'B', 'CDEFGH', 'AB', 'FGHI', 'GHIJKL']
['B', 'B', 'FGHI', 'GHIJKL']

推荐阅读