筛选字符串中包含N位数字的列表元素

时间:2019-01-02 17:40:40

标签: python list

我有一个列表,其中包含看起来像这样的交易数据的HS代码

trade_data = ['84 Nuclear Reactor',
  '8401 Nuclear Reactor:Fuel Elem',
  '840120 Isotopic Separation Machinery',
  '8401200000 Isotopic Separation Machinery, Apparatus And Parts']

我要过滤此列表,以便该列表仅包含名称中具有10位数字的项目,在这种情况下为“ 8401200000同位素分离机械,设备和零件”。

我尝试了

filtered_list = [x for x in trade_data if "\d{10}" in x] 

,但是代码返回一个空列表。反正有这样做吗?

2 个答案:

答案 0 :(得分:4)

似乎您正在尝试应用正则表达式模式。您可以使用re.search

import re
[x for x in trade_data if re.search(r"\d{10}", x)] 
# ['8401200000 Isotopic Separation Machinery, Apparatus And Parts']

或者,更好的是,预先编译模式:

p = re.compile(r"\d{10}")
[x for x in trade_data if p.search(x)] 
# ['8401200000 Isotopic Separation Machinery, Apparatus And Parts']
  

注意
  如果您需要匹配字符串开头的数字,请在模式中添加行首锚^

r'^\d{10}'

由于它最初被标记为熊猫,因此这里是熊猫的解决方案:

s = pd.Series(trade_data)
s[s.str.contains(r'^\d{10}')]

3    8401200000 Isotopic Separation Machinery, Appa...
dtype: object

答案 1 :(得分:0)

您可以在不使用正则表达式的情况下执行以下操作:

trade_data = ['84 Nuclear Reactor',
  '8401 Nuclear Reactor:Fuel Elem',
  '840120 Isotopic Separation Machinery',
  '8401200000 Isotopic Separation Machinery, Apparatus And Parts']
filtered_list = [i for i in trade_data if len([j for j in i if j.isdigit()])==10]
print(filtered_list) #prints ['8401200000 Isotopic Separation Machinery, Apparatus And Parts']