从字符串中提取数字到列表中[重复]
Posted
技术标签:
【中文标题】从字符串中提取数字到列表中[重复]【英文标题】:Extract numbers from a string into a list [duplicate] 【发布时间】:2017-05-22 09:48:33 【问题描述】:我想将字符串中的数字提取到列表中,但也包括其他字母。
例如:
a='a815e8ef951'
应该导致输出:
['a',815,'e',8,'f',951]
谢谢!
【问题讨论】:
指数符号呢,比如[1e8]
?
在此处发布之前,请在 Google 上搜索您的问题。
【参考方案1】:
您可以为此使用正则表达式和re
:
import re
matches = re.findall(r'(\d+|\D+)', 'a815e8ef951')
matches = [ int(x) if x.isdigit() else x for x in matches ]
# Output: ['a', 815, 'e', 8, 'ef', 951]
【讨论】:
没错。更新了列表扩展和isdigit
。
这是一个非常好的正则表达式答案。你很幸运,因为它只处理正数,否则很难让它适合 listcomp。也许你可以解释它是有效的,因为正则表达式默认是贪婪的。
同意:但我认为最好在处理额外的复杂性之前回答 OP。感谢您之前对 OP 问题的澄清。
不客气。你已经完成了困难的部分。【参考方案2】:
您主要使用 itertools.groupby
和 list comprehension 表达式为:
>>> from itertools import groupby, chain
>>> a='a815e8ef951'
>>> [''.join(s) for _, s in groupby(a, str.isalpha)]
['a', '815', 'e', '8', 'ef', '951']
如果还想将整型字符串转换为int
,则必须将表达式修改为:
>>> [''.join(s) if i else int(''.join(s)) for i, s in groupby(a, str.isalpha)]
['a', 815, 'e', 8, 'ef', 951]
为了使最后一个表达式更简洁,您将if
部分移动到某个函数:
def tranform_string(to_int, my_list):
my_string = ''.join(my_list)
return int(my_string) if to_int else my_string
new_list = [tranform_string(i, s) for i, s in groupby(a, str.isdigit)]
# using `isdigit()` here ^
new_list
将保存所需内容的位置。
【讨论】:
好,但 OP 显然也需要转换为整数groupby(a, lambda x: x.isalpha())
与groupby(a, str.isalpha)
相同
更新了答案
嗯,你还需要chain
吗?这里没有效果。
@vaultah 你是完全正确的。我不知道为什么我首先想到使用它。可能是我当时在想一些完全不相关的事情。谢谢~以上是关于从字符串中提取数字到列表中[重复]的主要内容,如果未能解决你的问题,请参考以下文章