从列表中删除多个元素的更简洁的方法?



我正在尝试切片和剥离字符串。我写了下面的代码:

my_list = ['from ab1c_table in WXYnprevious in time',
'from abc3_table in MNOnprevious in time',
'from ab1_cow_table in DZMC1_IN tabncurrent in time',
'from abc4_table in ERDUncurrent in time']
my_list_1 = []
for j in my_list:
s = j.split(" ")
s.remove('from')
s.remove('in')
s.remove('in')
s.remove('time')
for k in s:
k = k.replace('current', '')
k = k.replace('previous', '')
k = k.replace('n', '')
my_list_1.append(k)
if 'tab' in my_list_1:
my_list_1.remove('tab')
print(my_list_1)

它工作得很好,但问题是我必须分别删除每个单词。有没有办法用更少的行数来完成?我要找的输出是:

['WXY', 'MNO']

EDIT 1 -

我如何得到这个输出-

['ab1c_table', 'WXY', 'abc3_table', 'MNO', 'ab1_cow_table', 'DZMC1_IN', 'abc4_table', 'ERDU']

我不确定这是否是您想要的,但通常正则表达式对于从字符串中提取模式很有用。例如:

import re
my_list = ['from ab1c_table in WXYnprevious in time', 
'from abc3_table in MNOnprevious in time']
my_list1 = [re.findall(r" ([A-Z]{3})n", s, )[0] for s in my_list]
print(my_list_1)

编辑:

下面是对正则表达式模式的修改,反映了OP在下面的注释中提供的额外字符串示例:

mylist = ['from ab1c_table in WXYnprevious in time', 
'from abc3_table in MNOnprevious in time', 
'from ab1_cow_table in DZMC1_IN tabncurrent in time', 
'from abc4_table in ERDUncurrent in time']
my_list1 = [re.findall(r"_table in (S+)(?:| tab)n.* in time", s)[0] for s in mylist]
print(my_list1)

这给:

['WXY', 'MNO', 'DZMC1_IN', 'ERDU']

编辑2:

版本捕获_table模式:

import re
from itertools import chain
mylist = ['from ab1c_table in WXYnprevious in time', 
'from abc3_table in MNOnprevious in time', 
'from ab1_cow_table in DZMC1_IN tabncurrent in time', 
'from abc4_table in ERDUncurrent in time']
my_list1 = list(chain(*[re.findall(r"from (S+_table) in (S+).*?n.* in time", s)[0] for s in mylist]))
print(my_list1)

它给:

['ab1c_table', 'WXY', 'abc3_table', 'MNO', 'ab1_cow_table', 'DZMC1_IN', 'abc4_table', 'ERDU']

您可以编写匹配字符串的模式,例如使用(?:previous|current)匹配先前或当前,并捕获第1组中第一行的最后一部分。

首先检查是否存在匹配,如果存在,则将新值设置为第1组的值。

如果不匹配,不修改

bfrom w+ in (w+)nprevious in timeb

查看这个regex演示中绿色的捕获组值。

import re
pattern = r"bfrom w+ in (w+)n(?:previous|current) in timeb"
my_list = ['from ab1c_table in WXYnprevious in time', 'from abc3_table in MNOnprevious in time']
for n, i in enumerate(my_list):
m = re.match(pattern, i)
if m:
my_list[n] = m.group(1)
print(my_list)

输出
['WXY', 'MNO']

正如我之前建议的那样,我认为使用简单的split()可以更轻松地完成。字符串总是遵循相同的模式。您所需要做的就是在空格处进行分割,并从结果列表中取出第二个和第四个元素。

elems = list()
for e in my_list:
# e.g., the first element becomes
# ['from', 'ab1c_table', 'in', 'WXY', 'previous', 'in', 'time']
parts = e.split()
elems.extend([parts[1], parts[3]])
print(elems)

结果:

['ab1c_table',
'WXY',
'abc3_table',
'MNO',
'ab1_cow_table',
'DZMC1_IN',
'abc4_table',
'ERDU']

从问题中不清楚字符串中的变量是什么,但似乎这个正则表达式可以做到。目标是将所有静态内容与您想要的结果中的数据的一些通配符和括号括起来的捕获组相匹配。由于您希望按照在字符串中找到的顺序获得两段数据,因此可以创建两个捕获组并扩展结果列表。

import re

my_list = ['from ab1c_table in WXYnprevious in time',
'from abc3_table in MNOnprevious in time',
'from ab1_cow_table in DZMC1_IN tabncurrent in time',
'from abc4_table in ERDUncurrent in time']
result = []
for value in my_list:
result.extend(re.match(r"from (.+_table) in (S+)", value).groups())
print(result)

结果

['ab1c_table', 'WXY', 'abc3_table', 'MNO', 'ab1_cow_table', 'DZMC1_IN', 'abc4_table', 'ERDU']

最新更新