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

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

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

xdtwkeltjwlkejt7wthwk89lk 

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

Благодаря!

11 Solutions collect form web for “Python: найти индекс первой цифры в строке?”

Используйте 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 >>> 

Вот лучший и более гибкий способ, regex overkill здесь.

 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} 

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

 >>> 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] 
 import re mob = re.search('\d', 'xdtwkeltjwlkejt7wthwk89lk') if mob: print mob.start() 

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

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

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

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

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

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

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

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

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

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

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

У одного из моих коллег был действительно замечательный ответ на это:

 import re result = " Total files:................... 90" match = re.match(r".*[^\d](\d+)$", result) if match: print match.group(1) 
 def first_digit_index(iterable): try: return next(i for i, d in enumerate(iterable) if d.isdigit()) except StopIteration: return -1 

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

  • Как преобразовать строку в int в Python?
  • Какова максимальная длина строки python?
  • Как заменить некоторые символы из конца строки?
  • Python Regex - проверка заглавной буквы в нижнем регистре после
  • Удаление определенных управляющих символов (\ n \ r \ t) из строки
  • Счетчик слов Python
  • Объедините две строки (char by char) и повторите последний символ кратчайшего
  • Python - разница между двумя строками
  • Python - лучший язык программирования в мире.