【问题标题】:Parse string to int when string contains a number + extra characters [closed]当字符串包含数字+额外字符时将字符串解析为int [关闭]
【发布时间】:2013-07-26 18:10:12
【问题描述】:

使用 Python,我如何/应该将包含数字、后跟其他字符的字符串解析为 int?我要解决的具体问题是从包含一个数字的字符串中解析第一个数字,然后是任意数量的其他字符,包括可能是其他我不感兴趣的数字。

例如,如果字符串是"12//1",我只需要将12 转换为整数。

【问题讨论】:

  • -1;我不介意简单性,也不介意“Pythonic”答案的要求,但我确实介意这个问题。您提供了一个示例字符串,没有用例,也没有关于您希望如何进行解析的详细规则。你的例子没有告诉我们你想要什么数字作为给定的结果,例如字符串"//12"" 12//""1qwerty2""2.9""1 2";所有的回答者都只是从一个不清楚的例子中猜到了你想要的行为。
  • @MarkAmery 感谢您的建议。对于我试图解决的实际问题,这是一个合法但简单的问题,我无法在堆栈溢出(或谷歌)上找到答案。对于原始问题中的歧义,我深表歉意,并且我已经对其进行了更新,以澄清和摆脱对“最 Pythonic”的请求,以换取只是询问如何去做,因为那是我真正追求的。随意取消 1 我,或继续提出可能导致您这样做的更改,我很乐意考虑。
  • 对于 SO 警察,我再次更新了我的问题,试图使其不那么简洁,包括预期的结果。正如我在之前的评论中提到的,这是一个真实世界的 python 问题,经过几次 google 和 SO 搜索后我无法找到答案(我确定它就在那里,但如果有的话,它很难得到正确的词来得出准确的结果)。无论如何,我最终得到的答案非常有用,而且 SO 已经达到了它的目的,所以如果这就是你的问题,请随时结束我的问题。
  • @djechlin 我也有同样的问题。我的“研究”将我带到了这个页面,它现在是 Google 上的最高结果!
  • @BenRoberts:这个问题是完全合法的,可悲的是它只是不良适度的受害者......这个问题是 IMO 也可能很常见,但不幸的是标准 Python 库显然没有合理地解决。跨度>

标签: python


【解决方案1】:

如果要提取字符串中的数字:

int(''.join(c for c in s if c.isdigit()))

【讨论】:

  • +1 表示 Python 方式
  • 我希望 Python 支持 (c for c in s while c.isdigit())...
  • @OmriBarel 看看我的回答
  • @arshajii 啊哈,现在你的答案又看起来不错了 :-) lambda 是如此 1999...
  • @OmriBarel 实际上不需要lambda(请参阅更新)。我认为takewhile 是这里最好的方法。
【解决方案2】:

我会使用这个正则表达式:

import re
try:
    print int(re.compile("(\d+)").match('12//').group(1))
except:
    print "there was no number"

它将提取所有数字并在第一个非数字字符处停止。

\d 表示单个数字,\d+ 表示匹配至少一个数字,(\d+) 一起表示返回您在第 1 组中找到的内容。

【讨论】:

  • +1 表示正则表达式:D
  • 它还会在检查整个字符串之前退出(如果有一个数字和一百万个斜线......)
  • facepalm Pythonic 的做事方式是向他们抛出正则表达式。
  • 这里不需要捕获组;您可以使用"\d+" 和不带参数的.group()
【解决方案3】:

看起来像是itertools.takewhile 的工作:

>>> from itertools import takewhile
>>> s = '12//'
>>> int(''.join(takewhile(str.isdigit, s)))
12

【讨论】:

  • 这仅适用于假设您以数字开头,否则会抛出 ValueError
【解决方案4】:

这是一种很酷的技术,但如果它只是你描述的格式,它可能会有点矫枉过正:

import string
potential_bad_characters = string.ascii_puctuation + string.ascii_letters

int(my_string.translate(None,potential_bad_characters ))

#Or
int(mystring.rstrip(potential_bad_characters))

#Or
int(filter(str.isdigit,my_string))

#Or (kudos @JonClements)
potential_bad_characters = ''.join(map(chr, range(256))).replace('0123456789', '')
...

【讨论】:

  • 代替“潜在”,您可以反转“允许”,例如:''.join(map(chr, range(256))).replace('0123456789', '')(是一种方式)
【解决方案5】:

类似于 jh314s 的解决方案,但只在任何非数字字符之前使用数字(因此 34//98 将变为 34,而不是 3498)。假设字符串为“s”:

nonDigitIdx = [idx for idx,ch in enumerate(s) if not ch.isdigit()][0]
i = int(s[:nonDigitIdx-1])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 2014-06-22
    相关资源
    最近更新 更多