Python 查找字符串中第一个数字的索引

Python 查找字符串中第一个数字的索引,python,regex,string,Python,Regex,String,我有一根像 "xdtwkeltjwlkejt7wthwk89lk" 如何获取字符串中第一个数字的索引?正如其他解决方案所说,要查找字符串中第一个数字的索引,我们可以使用正则表达式: >>> s = 'xdtwkeltjwlkejt7wthwk89lk' >>> match = re.search(r'\d', s) >>> print match.start() if match else 'No digits found' 15 >

我有一根像

"xdtwkeltjwlkejt7wthwk89lk"

如何获取字符串中第一个数字的索引?

正如其他解决方案所说,要查找字符串中第一个数字的索引,我们可以使用正则表达式:

>>> s = 'xdtwkeltjwlkejt7wthwk89lk'
>>> match = re.search(r'\d', s)
>>> print match.start() if match else 'No digits found'
15
>>> s[15] # To show correctness
'7'
虽然很简单,但对于超长字符串来说,正则表达式匹配将是多余的。一种更有效的方法是像这样迭代字符串:

>>> for i, c in enumerate(s):
...     if c.isdigit():
...         print i
...         break
... 
15
import re

my_string = "xdtwkeltjwlkejt7wthwk89lk"

if first_digit := re.search(r"\d", my_string):
    print(first_digit.start())
如果我们想将问题扩展到查找第一个整数(不是数字)以及它是什么:

>>> s = 'xdtwkeltjwlkejt711wthwk89lk'
>>> for i, c in enumerate(s):
...     if c.isdigit():
...         start = i
...         while i < len(s) and s[i].isdigit():
...             i += 1
...         print 'Integer %d found at position %d' % (int(s[start:i]), start)
...         break
... 
Integer 711 found at position 15
>>s='xdtwkeltjwlkejt711wthwk89lk'
>>>对于枚举中的i、c:
...     如果c.isdigit():
...         开始=i
...         而i
我确信有多种解决方案,但使用正则表达式可以做到这一点:

>>> import re
>>> match = re.search("\d", "xdtwkeltjwlkejt7wthwk89lk")
>>> match.start(0)
15

可以使用正则表达式

import re
y = "xdtwkeltjwlkejt7wthwk89lk"

s = re.search("\d",y).start()
使用:


这里有一个更好、更灵活的方法,正则表达式在这里是多余的

s = 'xdtwkeltjwlkejt7wthwk89lk'

for i, c in enumerate(s):
    if c.isdigit():
        print(i)
        break
输出:

15
要获取所有数字及其位置,只需一个简单的表达式即可

>>> [(i, c) for i, c in enumerate('xdtwkeltjwlkejt7wthwk89lk') if c.isdigit()]
[(15, '7'), (21, '8'), (22, '9')]
或者,您可以创建数字及其最后位置的dict

>>> {c: i for i, c in enumerate('xdtwkeltjwlkejt7wthwk89lk') if c.isdigit()}
{'9': 22, '8': 21, '7': 15}

对于解析器来说,这似乎是一项不错的工作:

>>> from simpleparse.parser import Parser
>>> s = 'xdtwkeltjwlkejt7wthwk89lk'
>>> grammar = """
... integer := [0-9]+
... <alpha> := -integer+
... all     := (integer/alpha)+
... """
>>> parser = Parser(grammar, 'all')
>>> parser.parse(s)
(1, [('integer', 15, 16, None), ('integer', 21, 23, None)], 25)
>>> [ int(s[x[1]:x[2]]) for x in parser.parse(s)[1] ]
[7, 89]
>>来自simpleparse.parser导入解析器
>>>s='xdtwkeltjwlkejt7wthwk89lk'
>>>语法=”“
…整数:=[0-9]+
…:=-整数+
…全部:=(整数/α)+
... """
>>>parser=parser(语法“all”)
>>>parser.parse(s)
(1,[('integer',15,16,无),('integer',21,23,无)],25)
>>>解析器中x的[int(s[x[1]:x[2]])。parse(s)[1]]
[7, 89]

这里是另一种少正则表达式的方式,更多的是函数式的。这个函数找到字符串中每个数字第一次出现的位置,然后选择最低的数字。正则表达式可能会更有效,特别是对于较长的字符串(这使得至少10次完整的字符串传递,最多20次)


我想我会把我的方法扔掉。我会尽一切努力避免正则表达式

sequence = 'xdtwkeltjwlkejt7wthwk89lk'
i = [x.isdigit() for x in sequence].index(True)
要解释这里发生了什么:

  • [x.isdigit()表示序列中的x]
    将把字符串转换成一个布尔数组,表示每个字符是否为数字
  • […].index(True)
    返回在中找到的第一个索引值
    True
将输出

90
这不使用正则表达式,一旦找到第一个数字就会停止迭代。

要获取所有索引,请执行以下操作:

idxs = [i for i in range(0, len(string)) if string[i].isdigit()]
然后,要获取第一个索引,请执行以下操作:

if len(idxs):
    print(idxs[0])
else:
    print('No digits exist')

Python 3.8+中,您可以使用查找第一个
\d
(对于digit)字符类,如下所示:

>>> for i, c in enumerate(s):
...     if c.isdigit():
...         print i
...         break
... 
15
import re

my_string = "xdtwkeltjwlkejt7wthwk89lk"

if first_digit := re.search(r"\d", my_string):
    print(first_digit.start())
输出:

12
numidx
将是
instr
中第一个数字出现的索引。如果
instr
中没有数字,
numidx
将是
None



我在这里没有看到这个解决方案,我认为应该是这样。

您可以在匹配对象中找到位置。看看我的解决方案。这肯定是过火了,但这是一个很好的食谱@jsbueno:谢谢,这确实是一个过激的回答(至少在你必须扩展模式匹配之前,有时我很难理解我两个月前写的正则表达式):-)这个回答教会了我更多关于如何使用simpleparse的知识,而不是任何教程。如果有人对性能感兴趣,我在一些不同的方法上做了一些工作-正则表达式是最快的:为了得到找到的数字(在本例中为4),您将使用什么来代替
m.start()
。@zanahorias您可以使用
m.group(0)
自从@umbrae的基准测试以来已经很长时间了,目前在Python 3.7.8上,
isdigit()对于我来说,方法的速度总是快大约5-6%。请考虑在答案中添加一个简短的代码解释。不仅仅是第一个数字。这仅在最后一个字符是数字时才有效。如果字符串没有数字,则会引发
ValueError
。如果字符串没有数字,则会引发
indexer
。一行式更好<如果您的字符串没有任何数字,则会引发代码>AttributeError
AttributeError
如果您的字符串没有任何数字,则会引发。我不确定您是如何错过它的,但这与。
if len(idxs):
    print(idxs[0])
else:
    print('No digits exist')
import re

my_string = "xdtwkeltjwlkejt7wthwk89lk"

if first_digit := re.search(r"\d", my_string):
    print(first_digit.start())
instr = 'nkfnkjbvhbef0njhb h2konoon8ll'
numidx = next((i for i, s in enumerate(instr) if s.isdigit()), None)
print(numidx)
12