我有一个包含以下字符串的列表:
trait SomeMix {
}
trait Processor[T] {
def processMix(t: SomeMix) = {
println("processing SomeMix")
}
def processAsUsual(t:T)= {
println("processing T")
}
def process(t:T) = {
t match {
case mix: SomeMix => processMix(mix)
case _ => processAsUsual(t)
}
}
}
我需要删除常规整数以及其中带有破折号的整数,同时保留名称和其中带有破折号的名称。到目前为止,我已经编写了以下代码:
此代码删除所有破折号(但是我如何仅指定从整数字符串而不是对象字符串中删除破折号):
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()]
使用上面的代码,我能够删除所有整数,但同时也删除了所有带有破折号的“名称”-我需要保留带有破折号的名称。我该怎么办?
答案 0 :(得分:4)
(由于它被标记为熊猫),您可以使用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(看起来不错,没有正则表达式):
>>> [x for x in list1 if not x.replace('-', '').isdigit()]
['Name1', 'Name2', 'Name3', 'Name-4', 'Name-5', 'Name-6']
答案 1 :(得分:2)
您可以使用正则表达式-匹配对象是真实的,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']
(Python代码中不需要^
,因为re.match
从字符串的开头搜索。)
答案 2 :(得分:1)
我将使用显式的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']