首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从列表中删除带有破折号的整数,同时在对象中保留破折号

如何从列表中删除带有破折号的整数,同时在对象中保留破折号
EN

Stack Overflow用户
提问于 2018-10-22 19:18:28
回答 3查看 68关注 0票数 0

我有一个包含以下字符串的列表:

代码语言:javascript
复制
    list1 = ['01', '02', '03', '04', 05', '101-1', '101-2', 101-3', 
    'Name1', 'Name2', 'Name3', 'Name-4', 'Name-5', 'Name-6']

我需要移除普通整数和带有破折号的整数,同时保留名称和带有破折号的名称。到目前为止,我已经编写了以下代码:

此代码移除所有的破折号(但如何指定仅从整数字符串而不是对象字符串中删除破折号):

代码语言:javascript
复制
list2 = [i.replace('-','') for i in list1 if i.isdigit()]

此代码移除包装在字符串中的所有整数:

代码语言:javascript
复制
 list3 = [x for x in list2 if not (x.isdigit() or x[0] == '-' and x[1:].isdigit())]

使用上面的代码,我可以删除所有的整数,但它也可以删除所有带有破折号的“名称”--我需要在它们中保留带有破折号的名称。我该怎么做?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-22 19:22:08

您可以使用正则表达式-匹配对象是真实的,None是错误的。

代码语言:javascript
复制
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']

regex101.com上的演示

( ^代码中不需要re.match,因为re.match从字符串开始搜索。)

票数 2
EN

Stack Overflow用户

发布于 2018-10-22 19:26:42

(因为这是带标签的熊猫)你可以使用str.replace + str.isdigit

代码语言:javascript
复制
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):

代码语言:javascript
复制
>>> [x for x in list1 if not x.replace('-', '').isdigit()]
['Name1', 'Name2', 'Name3', 'Name-4', 'Name-5', 'Name-6']
票数 4
EN

Stack Overflow用户

发布于 2018-10-22 19:46:25

我会使用一个显式的for loop来存储在变量reslist comprehension中。

代码语言:javascript
复制
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,就会得到。

代码语言:javascript
复制
>>> res
>>> ['Name1', 'Name2', 'Name3', 'Name-4', 'Name-5', 'Name-6']

就清单理解而言,我会:

代码语言:javascript
复制
[val for val in list1 if re.search('[a-zA-Z]', val)]

>>> ['Name1', 'Name2', 'Name3', 'Name-4', 'Name-5', 'Name-6']
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52936360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档