Подтвердить что ты не робот

Найти индекс первой цифры в строке

У меня есть строка вроде

"xdtwkeltjwlkejt7wthwk89lk"

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

4b9b3361

Ответ 1

Используйте re.search():

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

Ответ 2

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

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

Или вы можете создать цифру и ее последнюю позицию

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

Ответ 3

Кажется хорошей работой для синтаксического анализатора:

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

Ответ 4

import re
first_digit = re.search('\d', 'xdtwkeltjwlkejt7wthwk89lk')
if first_digit is not None:
    print(first_digit.start())

Ответ 5

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

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

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

  • [x.isdigit() for x in sequence] собирается перевести строку в массив логических значений, представляющий, является ли каждый символ цифрой или нет.
  • [...].index(True) возвращает первое значение индекса, в котором находится True.

Ответ 6

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

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

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

idxs[0]

Ответ 7

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

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

Ответ 8

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

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

Ответ 9

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

Ответ 10

В Python 3. 8+ вы можете выполнять регулярные выражения в одной строке кода меньше

import re

my_string = "xdtwkeltjwlkejt7wthwk89lk"

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

Ответ 11

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

import re
y = "xdtwkeltjwlkejt7wthwk89lk"

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

Ответ 12

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

выведет

90

Ответ 13

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

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