【问题标题】: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 上搜索您的问题。

标签: python


【解决方案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.groupbylist 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 你是完全正确的。我不知道为什么我首先想到使用它。可能是我当时在想一些完全不相关的事情。谢谢~
猜你喜欢
  • 2018-12-14
  • 2017-02-17
  • 1970-01-01
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多