【问题标题】:How to tell if string starts with a number with Python?如何判断字符串是否以 Python 的数字开头?
【发布时间】:2011-07-31 10:54:23
【问题描述】:

我有一个以数字开头的字符串(从 0 到 9) 我知道我可以使用startswith()“或”10个测试用例,但可能有一个更简洁的解决方案

所以不要写

if (string.startswith('0') || string.startswith('2') ||
    string.startswith('3') || string.startswith('4') ||
    string.startswith('5') || string.startswith('6') ||
    string.startswith('7') || string.startswith('8') ||
    string.startswith('9')):
    #do something

有没有更聪明/更有效的方法?

【问题讨论】:

  • 如果问这个问题:“这是否过于重复?”,很可能——在高级语言中——答案是“为什么,是的,确实如此”。 Be lazy!
  • 你错过了string.startswith('1')
  • @Illusionist 正如所写,您的问题意味着您想要检测仅以一位数字开头的字符串。如果是这样,以下答案中唯一正确的答案不是使用s[0]s[:1] 的答案,而是John Machin 的解决方案:if s.startswith(tuple('0123456789'))。此外,当 s 是像元组或列表这样的序列时,此解决方案会引发错误,这种情况会产生与字符串相同的结果。 - 另一种解决方案是一个正则表达式,它的模式是 '\d(?=\D)' 但在这里使用正则表达式是多余的。
  • 只是迂腐:string 是标准库中的一个模块,可能不应该用作变量名。 docs.python.org/2/library/string.html

标签: python string digits


【解决方案1】:
>>> string = '1abc'
>>> string[0].isdigit()
True

【讨论】:

  • 我不是一个 python 人,所以也许你可以帮我解决这个问题:这个函数会在没有string[0] 的地方轰炸吗?
  • 是的,它肯定会。您可以使用 (string or 'x')[0].isdigit() 将其修复为 '' 或 None
  • 你可以试试string[:1].isdigit(),它会很高兴地退出处理一个空字符串。
  • 因为那不是我的答案;在程序员希望在空字符串上抛出异常的情况下,我的还是更好。
  • @jcomeau_ictx 完全正确。永远不要进行防御性编程。如果字符串意外地为空,则 应该 出错并且无论如何都不应该自动处理。一些思想流派说你应该优雅地处理和捕获不重要的异常作为警告并保持程序运行。对于大多数用例,我不是这种心态。您正在编写的函数和代码的特殊性有助于缓解您需要更频繁地进行防御性编码的边缘情况。
【解决方案2】:

这段代码:

for s in ("fukushima", "123 is a number", ""):
    print s.ljust(20),  s[0].isdigit() if s else False

打印出以下内容:

fukushima            False
123 is a number      True
                     False

【讨论】:

  • 那太丑了。使用s[:1].isdigit()s and s[0].isdigit()
  • @John Machin 你说的“丑陋”是什么意思?不可读?我没有发现您在上面的提议更具可读性。在我看来,s and s[0].isdigit() 的可读性更差。就个人而言,我喜欢构造 ... if ... else ... 考虑到您的评论,我会像这样改进它:s[0].isdigit() if s!="" else False
【解决方案3】:

令人惊讶的是,经过这么长时间仍然找不到最佳答案。

其他答案的缺点是使用[0] 选择第一个字符,但如上所述,这会在空字符串上中断。

使用下面的代码可以绕过这个问题,并且在我看来,它给出了我们所拥有的选项中最漂亮和最易读的语法。它也不会导入/使用正则表达式):

>>> string = '1abc'
>>> string[:1].isdigit()
True

>>> string = ''
>>> string[:1].isdigit()
False

【讨论】:

    【解决方案4】:

    你也可以使用try...except:

    try:
        int(string[0])
        # do your stuff
    except:
        pass # or do your stuff
    

    【讨论】:

      【解决方案5】:

      这是我的“答案”(试图在这里与众不同,我实际上并不推荐这种特殊情况:-)

      使用 ord()特殊的a <= b <= c 形式:

      //starts_with_digit = ord('0') <= ord(mystring[0]) <= ord('9')
      //I was thinking too much in C. Strings are perfectly comparable.
      starts_with_digit = '0' <= mystring[0] <= '9'
      

      (这个a &lt;= b &lt;= c,和a &lt; b &lt; c一样,是一个特殊的Python结构,它很简洁:比较1 &lt; 2 &lt; 3(真)和1 &lt; 3 &lt; 2(假)和(1 &lt; 3) &lt; 2(真)。这是' t 它在大多数其他语言中的工作方式。)

      使用regular expression

      import re
      //starts_with_digit = re.match(r"^\d", mystring) is not None
      //re.match is already anchored
      starts_with_digit = re.match(r"\d", mystring) is not None
      

      【讨论】:

      • (1) 在正则表达式中丢失ord() (2) 在正则表达式中丢失^
      【解决方案6】:

      您的代码不起作用;你需要or 而不是||

      试试

      '0' <= strg[:1] <= '9'
      

      strg[:1] in '0123456789'
      

      或者,如果你真的很喜欢startswith

      strg.startswith(('0', '1', '2', '3', '4', '5', '6', '7', '8', '9'))
      

      【讨论】:

      • 如果只有 startswith(a tuple) 的解决方案,我会支持你。但是strg[:1] 的解决方案有两个不便之处:如果 s 可能恰好是字符串列表,它们不会引发错误,并且如果字符串会产生 True以几个数字开头。
      • @eyquem 如果字符串以几个数字开头,它们会产生 True 那么?其他答案不会检查这一点,因为它不需要检查其他字符是否不是数字。
      • amstartswith 疯狂,并在我的代码中以这种方式实现了它。谢谢。
      • 再一次从可能性开始...startswith(tuple(str(i) for i in range(10)))
      • .isdigit() 是首选
      【解决方案7】:

      试试这个:

      if string[0] in range(10):
      

      【讨论】:

      • 这根本不起作用。 range(10) 产生一个整数列表,而 string[0] 是一个长度为 1 的字符串。
      • 那行不通;类型不匹配。但是:if string[0] in map(str,range(10)) 有效
      【解决方案8】:

      你可以使用regular expressions

      您可以使用以下方法检测数字:

      if(re.search([0-9], yourstring[:1])):
      #do something
      

      [0-9] par 匹配任何数字,yourstring[:1] 匹配字符串的第一个字符

      【讨论】:

        【解决方案9】:

        如果您打算以某种方式扩展方法的功能,请使用Regular Expressions

        【讨论】:

          【解决方案10】:

          有时,您可以使用正则表达式

          >>> import re
          >>> re.search('^\s*[0-9]',"0abc")
          <_sre.SRE_Match object at 0xb7722fa8>
          

          【讨论】:

          • 矫枉过正!既然可以在 bultins 中做到,为什么还要使用 re
          • @JakobBowyer 至少,很高兴知道它!即使在这种情况下,是的,如果某些内置函数可以做同样的事情,正则表达式是矫枉过正的。
          【解决方案11】:

          Python 的string 库有isdigit() 方法:

          string[0].isdigit()
          

          【讨论】:

          • Python2的string 模块没有方法,而isdigitstrunicode对象的方法。
          • @plaes: -1 由于上述情况加上如果 s == "" 它会崩溃
          • 看看我的答案不会因为空字符串而中断:string[:1].isdigit()
          猜你喜欢
          • 2010-11-21
          • 2011-05-31
          • 2020-08-26
          • 1970-01-01
          • 2010-09-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多