假设有一个列表
["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)
有更好的方法吗。时间不是什么大问题,但我确实想减少的代码行
由于您的模式有固定的长度,因此可以通过正向查找(?<=)
找到模式后面的单词。
代码
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']