截断列表项

Truncate list items

假设有一个列表

["element1 abc, 1999 mno", "element2 abc", "element3 xyz, 2019 pqr", "element4 xyz", "element5 xyz, 1999 wasd"]

如果存在模式,我想截断列表中的所有项目。 假设模式是 ["xyz, \d{4}", "abc, \d{4}"] 结果列表将是

["element1 abc, 1999", "element2 abc", "element3 xyz, 2019", "element4 xyz", "element5 xyz, 1999"]

位置 0、2 和 4 的项目被截断,因为遇到模式 "xyz,"+year"abc,"+year

下面是我当前的代码

import re

ls = ["element1 abc, 1999 mno", "element2 abc", "element3 xyz, 2019 pqr", "element4 xyz", "element5 xyz, 1999 wasd"]
outls = []
pattern = ["xyz, \d{4}", "abc, \d{4}"]

for i in ls:
    appendTracker = 1
    for j in pattern:
        match = re.search(j, i)
        if match:
            matched = match.group()
            appendTracker = 0
            outls.append(i[:i.rfind(matched)+len(matched)])
            break
        
    if appendTracker:
        outls.append(i)

有没有更好的方法来做到这一点。时间不是问题,但我确实想减少代码行数

由于您的模式有固定长度,模式后面的单词可以通过positive lookbehind (?<=)找到。

代码

ls = ["element1 abc", "element2 abc", "element3 xyz, 2019 pqr", "element4 xyz", "element5 xyz, 1999 wasd"]    
ans = [re.sub(r"(?<=(xyz|abc)\, \d{4}).*", "", s) for s in ls]

输出

print(ans)

['element1 abc',
 'element2 abc',
 'element3 xyz, 2019',
 'element4 xyz',
 'element5 xyz, 1999']