如何使用Python判断字符串是否以数字开头?


91

我有一个以数字(从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

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


如果问这个问题:“这是否太重复了吗?”,用高级语言来说,答案是“为什么,是,肯定是”。偷懒!

42
你错过了string.startswith('1')
MAK

2
@Illusionist在撰写本文时,您的问题意味着您想检测仅以一位数字开头的字符串。如果是这样,那么以下答案中唯一的正确答案,不是使用s[0]或使用s[:1]John Machin的解决方案的答案:if s.startswith(tuple('0123456789'))。此外,当s是一个类似于元组或列表的序列时,此解决方案会引发错误,这种情况下产生的结果与它是字符串一样。-另一个解决方案是正则表达式,其模式为'\ d(?= \ D)',但是这里不需要使用正则表达式。
eyquem

3
只是脚:string是标准库中的一个模块,可能不应该用作变量名。docs.python.org/2/library/string.html
gak 2013年

Answers:


170

Python的string库具有isdigit()方法:

string[0].isdigit()

5
Python2的string 模块没有方法,isdigit而是strandunicode对象的方法。
John Machin

3
@plaes:-1由于上述加号,如果s ==“”,它将崩溃
John Machin

3
看看我的答案,它不会中断为空字符串:string[:1].isdigit()
PascalVKooten '19

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

我不是python专家,所以也许您可以在这方面为我提供帮助:此功能是否会在“”上炸弹,而那里没有string[0]
corsiKa 2011年

是的,肯定会。您可以使用(string或'x')[0] .isdigit()将其修复为“”或“无”
jcomeau_ictx 2011年

30
您可以尝试使用string[:1].isdigit(),它将愉快地退出以处理空字符串。
西蒙·卡兰

2
因为那不是我的答案;在程序员希望将异常抛出到空字符串的情况下,我的方法仍然更好。
jcomeau_ictx 2015年

1
@jcomeau_ictx完全正确。从不防御程序。如果字符串意外为空,则应该出错,并且无论如何都不应自动对其进行处理。一些思想流派说,您应该优雅地处理和捕获那些不重要的异常,以警告并保持程序正常运行。对于大多数用例,我都不是这样。您正在编写的功能和代码的特殊性有助于缓解极端情况,在这种情况下您需要更频繁地进行防御性编码。
jamescampbell

10

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

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

矫kill过正!当您可以在bultins中使用它时,为什么还要使用re
Jakob Bowyer

1
@JakobBowyer至少,很高兴知道这一点!即使在这种情况下,是的,如果某些内建函数可以执行相同的操作,则正则表达式会显得过大。
jeromej

8

您的代码将无法正常工作;您需要or代替||

尝试

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

要么

strg[:1] in '0123456789'

或者,如果您真的很疯狂startswith

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

如果只有startswith(tuple)解决方案,我会为您投票。但是解决方案strg[:1]有两个不便之处:如果s可能是字符串列表,它们不会引发错误;如果字符串以数位开头,则它们会产生True
eyquem

@eyquem如果字符串以几个数字开头,它们将生成True。其他答案不需要检查,因为它不是必须要检查其他字符不是数字的要求。
罗伯·格兰特

疯了startswith,并没有实现它这样在我的代码。谢谢。
jamescampbell,2016年

还有一个可能性startswith ...startswith(tuple(str(i) for i in range(10)))
杰罗姆

4

这段代码:

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

4
太丑了 使用s[:1].isdigit()s and s[0].isdigit()
John Machin

1
@John Machin“丑陋”是什么意思?不可读?我在上面找不到您的主张更易读。s and s[0].isdigit()我认为可读性更差。就个人而言,我喜欢这种结构...如果...否则...考虑到您的评论,我会这样改善它:s[0].isdigit() if s!="" else False
eyquem 2011年

3

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

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

我认为,使用以下内容可以避免此问题,并提供我们所拥有选项最漂亮,最易读的语法。它也不会使用正则表达式导入/填充):

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

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

2

您也可以使用try...except

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

1

这是我的“答案”(尝试在这里独树一帜,对于这种特殊情况,我实际上也不推荐:)

使用 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 <= b <= c和一样a < b < c,是一种特殊的Python构造,很简洁:比较1 < 2 < 3(true)和1 < 3 < 2(false)和(1 < 3) < 2(true)。这在大多数其他语言中不是这样。)

使用正则表达式

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
(1)丢失ord()(2)^在正则表达式中丢失。
John Machin

0

您可以使用正则表达式

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

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

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



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.