Python: найти индекс первой цифры в строке? - PullRequest
38 голосов
/ 22 декабря 2010

Я подозреваю, что это проблема регулярных выражений - и очень простая, поэтому извиняюсь.

В Python, если у меня есть строка типа

xdtwkeltjwlkejt7wthwk89lk

, как я могу получить индекс первой цифры в строке?

Спасибо!

Ответы [ 12 ]

59 голосов
/ 22 декабря 2010

Использование 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
>>> 
18 голосов
/ 22 декабря 2010

Это лучший и более гибкий способ, здесь регулярное выражение избыточно.

s='xdtwkeltjwlkejt7wthwk89lk'

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

output:

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}
11 голосов
/ 22 декабря 2010

похоже на хорошую работу для парсера

8 голосов
/ 15 ноября 2013

Думаю, я бы бросил свой метод в кучу.Я сделаю все, чтобы избежать регулярных выражений.

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

Чтобы объяснить, что здесь происходит:

  • [x.isdigit() for x in sequence] собирается перевести строку в массив логических значенийпредставляющий, является ли каждый символ цифрой или нет
  • [...].index(True) возвращает первое значение индекса, в котором найдено True.
8 голосов
/ 22 декабря 2010
import re
mob = re.search('\d', 'xdtwkeltjwlkejt7wthwk89lk')
if mob:
    print mob.start()
3 голосов
/ 22 декабря 2010

Вот еще один метод без регулярных выражений, более функциональный. Этот находит позицию первого вхождения каждой цифры, которая существует в строке, затем выбирает самую низкую. Регулярное выражение, вероятно, будет более эффективным, особенно для более длинных строк (это делает по крайней мере 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
2 голосов
/ 22 декабря 2010

Я уверен, что есть несколько решений, но с помощью регулярных выражений вы можете сделать это:

>>> import re
>>> match = re.search("\d", "xdtwkeltjwlkejt7wthwk89lk")
>>> match.start(0)
15
2 голосов
/ 22 декабря 2010

Как говорят другие решения, чтобы найти индекс первой цифры в строке, мы можем использовать регулярные выражения:

>>> 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
1 голос
/ 02 мая 2018

Чтобы получить все индексы, выполните:

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

Затем, чтобы получить первый индекс, выполните:

idxs[0]
1 голос
/ 22 декабря 2010

Вы можете использовать регулярное выражение

import re
y = "xdtwkeltjwlkejt7wthwk89lk"

s = re.search("\d",y).start()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...