list2 = ['BIA-660', 'Web', 'Analytics']
问题:如何从list2
中提取"660"?
list2 = ['BIA-660', 'Web', 'Analytics']
c=list2[0]
x=c.split("-")
print(x[1])
我已经得到答案,但是想知道是否有另一种更有效的方法来实现这个解决方案。
import re
list2 = ['BIA-660', 'Web', 'Analytics']
for strg in list2:
found = re.findall('\d+', strg)
if found != []:
for num in found:
print(num)
输出:
660
list2 = ['BIA-660', 'Web', 'Analytics']
s = '-'.join(list2)
# extract numbers from string
result = [int(txt) for txt in s.split('-') if txt.isdigit()]
print(result)
[660]
我发现在处理这些东西时,获取结果的同时知道结果来自哪里非常重要。因此,除了返回数据外,它还会告诉输入列表中找到该索引的位置。
还考虑了由一个或多个“-”分隔的多个项目,以及像 foo-bar-zoom
这样的情况。
def extractor(li : list[str]) -> list[tuple[str,int]]:
res = []
for ix, v in enumerate(li):
if "-" in v:
found = v.split('-',maxsplit=1)[1]
res.append((found,ix))
return res
一些运行:
✅!
extractor for ['BIA-660', 'Web', 'Analytics']
exp :[('660', 0)]:
got :[('660', 0)]:
✅!
extractor for ['BIA-660', 'Web-3.0', 'Analytics']
exp :[('660', 0), ('3.0', 1)]:
got :[('660', 0), ('3.0', 1)]:
✅!
extractor for ['BIA-660', 'foo-bar-zoom']
exp :[('660', 0), ('bar-zoom', 1)]:
got :[('660', 0), ('bar-zoom', 1)]:
你可以扩展它以忽略不是字符串的列表项(isinstance(v,str)
),并且提取的值不是数字(检查float(found)
是否成功)。
print(list2[0].split('-')[1])
来避免所有中间变量。 - Barmarsplit
的第二个参数来限制分割的次数,或者使用rsplit
,具体取决于你需要哪些元素。 - cmd