截断列表项
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']
假设有一个列表
["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']