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

时间:2010-12-22 15:31:34

标签: python string

我怀疑这是一个正则表达式问题 - 而且是一个非常基本的问题,所以道歉。

在Python中,如果我有一个像

这样的字符串
xdtwkeltjwlkejt7wthwk89lk

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

谢谢!

14 个答案:

答案 0 :(得分:59)

使用re.search()

>>> import re
>>> s1 = "thishasadigit4here"
>>> m = re.search("\d", s1)
>>> if m:
...     print "Digit found at position %d" % m.start()
... else:
...     print "No digit in that string"
... 
Digit found at position 13
>>> 

答案 1 :(得分:18)

这是一种更好,更灵活的方式,正则表达式在这里过度。

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')]

在Python 2.7+中,你可以创建一个数字字典及其位置

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

答案 2 :(得分:11)

对于解析器来说似乎很划算:

>>> 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]

答案 3 :(得分:8)

import re
mob = re.search('\d', 'xdtwkeltjwlkejt7wthwk89lk')
if mob:
    print mob.start()

答案 4 :(得分:8)

以为我会把我的方法扔到一堆。我会做任何事来避免正则表达式。

sequence = 'xdtwkeltjwlkejt7wthwk89lk'
i = [x.isdigit() for x in sequence].index(True)

要解释这里发生了什么:

  • [x.isdigit() for x in sequence]将字符串转换为一个布尔数组,表示每个字符是否为数字
  • [...].index(True)返回找到True的第一个索引值。

答案 5 :(得分:3)

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

haystack = "xdtwkeltjwlkejt7wthwk89lk"
digits   = "012345689"
found    = [haystack.index(dig) for dig in digits if dig in haystack]
firstdig = min(found) if found else None

答案 6 :(得分:2)

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

>>> 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

如果我们想将问题扩展到找到第一个整数(而非数字)及其原因:

>>> 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

答案 7 :(得分:2)

我确信有多种解决方案,但使用正则表达式可以做到这一点:

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

答案 8 :(得分:2)

在Python 3.8+中,您可以用更少的一行代码来完成正则表达式

import re

my_string = "xdtwkeltjwlkejt7wthwk89lk"

if (first_digit := re.search(r"\d", my_string)) is not None:
    print(first_digit.start())

答案 9 :(得分:1)

你可以使用正则表达式

import re
y = "xdtwkeltjwlkejt7wthwk89lk"

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

答案 10 :(得分:1)

要获取所有索引:

response from server: 
Object { headers: {…}, status: 200, statusText: "OK", url: "http://localhost:9000/ws/users/signin", ok: true, type: 4, body: {…} }
main.bundle.js:1127:13
response headers 
[…]
​
0: "Content-Length"
​
1: "Content-Security-Policy"
​
2: "Content-Type"
​
3: "Date"
​
4: "Referrer-Policy"
​
5: "X-Content-Type-Options"
​
6: "X-Frame-Options"
​
7: "X-Permitted-Cross-Domain-Policies"
​
8: "X-XSS-Protection"
​
length: 9

然后获取第一个索引:

idxs = [i for i in range(0, len(string)) if string[i].isdigit()]

答案 11 :(得分:0)

我的一位同事对此有一个非常棒的答案:

import re
result = "  Total files:...................     90"
match = re.match(r".*[^\d](\d+)$", result)
if match:
    print match.group(1)

答案 12 :(得分:0)

def first_digit_index(iterable):
    try:
        return next(i for i, d in enumerate(iterable) if d.isdigit())
    except StopIteration:
        return -1

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

答案 13 :(得分:0)

instr = 'nkfnkjbvhbef0njhb h2konoon8ll'
numidx = next((i for i, s in enumerate(instr) if s.isdigit()), None)
print numidx

输出:

12

numidx将是instr中第一个出现的数字的索引。如果instr中没有数字,则numidx将为“无”。

我在这里没有看到此解决方案,并且认为应该如此。