我有一个包含以下字符串的列表:
list1 = ['01', '02', '03', '04', 05', '101-1', '101-2', 101-3',
'Name1', 'Name2', 'Name3', 'Name-4', 'Name-5', 'Name-6']我需要移除普通整数和带有破折号的整数,同时保留名称和带有破折号的名称。到目前为止,我已经编写了以下代码:
此代码移除所有的破折号(但如何指定仅从整数字符串而不是对象字符串中删除破折号):
list2 = [i.replace('-','') for i in list1 if i.isdigit()]此代码移除包装在字符串中的所有整数:
list3 = [x for x in list2 if not (x.isdigit() or x[0] == '-' and x[1:].isdigit())]使用上面的代码,我可以删除所有的整数,但它也可以删除所有带有破折号的“名称”--我需要在它们中保留带有破折号的名称。我该怎么做?
发布于 2018-10-22 19:22:08
您可以使用正则表达式-匹配对象是真实的,None是错误的。
import re
>>> list1 = ['01', '02', '03', '04', '05', '101-1', '101-2', '101-3',
...: 'Name1', 'Name2', 'Name3', 'Name-4', 'Name-5', 'Name-6']
...:
>>> [x for x in list1 if not re.match(r'\d+(-\d+)?$', x)]
>>> ['Name1', 'Name2', 'Name3', 'Name-4', 'Name-5', 'Name-6']( ^代码中不需要re.match,因为re.match从字符串开始搜索。)
发布于 2018-10-22 19:26:42
(因为这是带标签的熊猫)你可以使用str.replace + str.isdigit
s = pd.Series(list1)
s[~s.str.replace('-', '', regex=False).str.isdigit()]
8 Name1
9 Name2
10 Name3
11 Name-4
12 Name-5
13 Name-6
dtype: object要返回一个列表,请在结果中调用.tolist()。
将其转换为纯python,我们将获得列表comp等效(请参阅ma,没有regex):
>>> [x for x in list1 if not x.replace('-', '').isdigit()]
['Name1', 'Name2', 'Name3', 'Name-4', 'Name-5', 'Name-6']发布于 2018-10-22 19:46:25
我会使用一个显式的for loop来存储在变量res或list comprehension中。
import re
list1 = ['01', '02', '03', '04', '05', '101-1', '101-2', '101-3', 'Name1', 'Name2', 'Name3', 'Name-4', 'Name-5', 'Name-6']
res = []
for val in list1:
if re.search('[a-zA-Z]', val):
res.append(val)如果我们打印res,就会得到。
>>> res
>>> ['Name1', 'Name2', 'Name3', 'Name-4', 'Name-5', 'Name-6']就清单理解而言,我会:
[val for val in list1 if re.search('[a-zA-Z]', val)]
>>> ['Name1', 'Name2', 'Name3', 'Name-4', 'Name-5', 'Name-6']https://stackoverflow.com/questions/52936360
复制相似问题