Как найти индекс числа в строке

У меня есть строка "123 _457 78", нужно, чтобы код вывел индекс каждого числа (начало и конец). Вывод для этой строки должен быть: [[0, 2], [5, 7], [9, 10]]

задан 9 окт 2021 в 18:38

Its-MatriX's user avatar

Its-MatriXIts-MatriX

451 серебряный знак5 бронзовых знаков

0

1 ответ

Используя regexp это делается в одну строчку.

import re
result = list(map(lambda m: [m.start(), m.end()-1], re.finditer(r'd+', "123 _457 78")))
print(result)

ответ дан 9 окт 2021 в 20:07

GrAnd's user avatar

GrAndGrAnd

13.4k1 золотой знак8 серебряных знаков23 бронзовых знака

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

Есть строка t2i3h3s3digit4here55.
Нужно получить индекс каждой цифры.
Например для первой цифры это будет – Цифра 2 индекс 1 (от 0).
Например для второй цифры это будет – Цифра 3 индекс 3 (от 0).

Пробую нечто такое, но ничего не выходит:

s1 = "t2i3h3s3digit4here55" 
m = re.search("d", s1) 
print(m)
#<re.Match object; span=(13, 14), match='4'>
if m:
    print( "Digit found at position " + str(m) + "") 
##Digit found at position <re.Match object; span=(13, 14), match='4'>   
else:
    print( "No digit in that string")


  • Вопрос задан

    более года назад

  • 90 просмотров

Пригласить эксперта

Позиция цифры (т.е. индекс начала найденной выражением строки) можно получить из m.start().
UPD: Для повторного поиска совпадений есть фунцкия re.finditer():
[m.start() for m in re.finditer("d", s1)]

Более говнокодистый вариант через цикл и search

search ищет только первое совпадение, надо дальше циклом прогонять, примерно так:

idxs = []
l = 0
while m := re.search("d", s1):
	idxs.append(l + m.start())
	l += m.end()
	s1 = s1[m.end():]

Но вообще-то регулярные выражение для поиска цифр – перебор. Хватит и этого:

[i for i, c in enumerate(s1) if c >= '0' and c <= '9']

s1 = "t2i3h3s3digit4here55" 
a = []
for i, x in enumerate(s1):
	try:
		if isinstance(int(x), int):
			a.append(i)
	except Exception as e:
		pass
print(a)


  • Показать ещё
    Загружается…

25 мая 2023, в 01:56

1200 руб./за проект

25 мая 2023, в 01:47

3000 руб./за проект

25 мая 2023, в 01:07

5000 руб./за проект

Минуточку внимания

Строки представляют собой набор символов. Каждый символ в строке занимает определенную позицию, т.е имеет свой индекс. Зная этот индекс, мы можем получить доступ к тому или иному символу. В этой статье мы рассмотрим, как найти индекс символа в строке.

Как найти индекс символа в строке при помощи функции find()

Функция find() возвращает позицию подстроки. Мы также можем указать начальную и конечную позиции, между которыми хотим искать (по умолчанию поиск происходит от начала до конца строки).

В следующем коде мы используем эту функцию для поиска позиции символа в строке.

s = 'python is fun'
c = 'n'
print(s.find(c))

# 5

Обратите внимание, что функция возвращает позицию символа, идущего в строке первым. То есть мы получили индекс символа “n” из слова “python”, а не из слова “fun”. Также следует помнить, что функция find() возвращает -1, если заданная подстрока отсутствует в строке.

Использование функции rfind()

Эта функция аналогична функции find(), с той лишь разницей, что она возвращает последнюю позицию, на которой расположена искомая подстрока. Например:

s = 'python is fun'
c = 'n'
print(s.rfind(c))

#12

Как найти индекс символа в строке при помощи функции index()

Функция index() тоже позволяет найти индекс подстроки в строке. Как и find(), она возвращает первое вхождение искомого символа в строке. Например:

s = 'python is fun'
c = 'n'
print(s.index(c))

# 5

Разница между функциями index() и find() заключается в том, что функция index() возвращает ValueError, если в строке отсутствует нужный символ.

Использование цикла for для поиска позиции символа в строке

При таком подходе мы перебираем символы строки в цикле и сравниваем каждый символ с искомым. Каждая позиция, по которой найдено совпадение, отмечается и сохраняется в отдельной переменной.

Следующий код реализует эту логику.

s = 'python is fun'
c = 'n'
lst = []
for pos,char in enumerate(s):
    if(char == c):
        lst.append(pos)
print(lst)

#[5, 12]

Мы используем функцию enumerate(), поскольку она упрощает итерацию и присваивает переменную счетчика каждому символу строки.

Это также можно реализовать с помощью list comprehension, что считается более быстрым и чистым решением. Например:

s = 'python is fun'
c = 'n'
print([pos for pos, char in enumerate(s) if char == c])

# [5, 12]

Перевод статьи Manav Narula «Find Character in a String in Python».

Текстовые переменные str в Питоне

Строковый тип str в Python используют для работы с любыми текстовыми данными. Python автоматически определяет тип str по кавычкам – одинарным или двойным:

        >>> stroka = 'Python'
>>> type(stroka)
<class 'str'>
>>> stroka2 = "code"
>>> type(stroka2)
<class 'str'>

    

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

        stroka = ''
    

Или:

        stroka2 = ""
    

Если в самой строке нужно использовать кавычки – например, для названия книги – то один вид кавычек используют для строки, второй – для выделения названия:

        >>> print("'Самоучитель Python' - возможно, лучший справочник по Питону.")
'Самоучитель Python' - возможно, лучший справочник по Питону.
>>> print('"Самоучитель Python" - возможно, лучший справочник по Питону.')
"Самоучитель Python" - возможно, лучший справочник по Питону.

    

Использование одного и того же вида кавычек внутри и снаружи строки вызовет ошибку:

        >>> print(""Самоучитель Python" - возможно, лучший справочник по Питону.")
  File "<pyshell>", line 1
    print(""Самоучитель Python" - возможно, лучший справочник по Питону.")
                      ^
SyntaxError: invalid syntax

    

Кроме двойных " и одинарных кавычек ', в Python используются и тройные ''' – в них заключают текст, состоящий из нескольких строк, или программный код:

        >>> print('''В тройные кавычки заключают многострочный текст.
Программный код также можно выделить тройными кавычками.''')
В тройные кавычки заключают многострочный текст.
Программный код также можно выделить тройными кавычками.

    

Длина строки len в Python

Для определения длины строки используется встроенная функция len(). Она подсчитывает общее количество символов в строке, включая пробелы:

        >>> stroka = 'python'
>>> print(len(stroka))
6
>>> stroka1 = ' '
>>> print(len(stroka1))
1

    

Преобразование других типов данных в строку

Целые и вещественные числа преобразуются в строки одинаково:

        >>> number1 = 55
>>> number2 = 55.5
>>> stroka1 = str(number1)
>>> stroka2 = str(number2)
>>> print(type(stroka1))
<class 'str'>
>>> print(type(stroka2))
<class 'str'>

    

Решение многих задач значительно упрощается, если работать с числами в строковом формате. Особенно это касается заданий, где нужно разделять числа на разряды – сотни, десятки и единицы.

Сложение и умножение строк

Как уже упоминалось в предыдущей главе, строки можно складывать – эта операция также известна как конкатенация:

        >>> str1 = 'Python'
>>> str2 = ' - '
>>> str3 = 'самый гибкий язык программирования'
>>> print(str1 + str2 + str3)
Python - самый гибкий язык программирования

    

При необходимости строку можно умножить на целое число – эта операция называется репликацией:

        >>> stroka = '*** '
>>> print(stroka * 5)
*** *** *** *** ***

    

Подстроки

Подстрокой называется фрагмент определенной строки. Например, ‘abra’ является подстрокой ‘abrakadabra’. Чтобы определить, входит ли какая-то определенная подстрока в строку, используют оператор in:

        >>> stroka = 'abrakadabra'
>>> print('abra' in stroka)
True
>>> print('zebra' in stroka)
False

    

Для обращения к определенному символу строки используют индекс – порядковый номер элемента. Python поддерживает два типа индексации – положительную, при которой отсчет элементов начинается с 0 и с начала строки, и отрицательную, при которой отсчет начинается с -1 и с конца:

Положительные индексы 0 1 2 3 4 5 6
Пример строки P r o g l i b
Отрицательные индексы -7 -6 -5 -4 -3 -2 -1

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

        >>> stroka = 'программирование'
>>> print(stroka[7])
м
>>> print(stroka[-1])
е

    

Срезы строк в Python

Индексы позволяют работать с отдельными элементами строк. Для работы с подстроками используют срезы, в которых задается нужный диапазон:

        >>> stroka = 'программирование'
>>> print(stroka[7:10])
мир

    

Диапазон среза [a:b] начинается с первого указанного элемента а включительно, и заканчивается на последнем, не включая b в результат:

        >>> stroka = 'программa'
>>> print(stroka[3:8])
грамм
    

Если не указать первый элемент диапазона [:b], срез будет выполнен с начала строки до позиции второго элемента b:

        >>> stroka = 'программa'
>>> print(stroka[:4])
прог

    

В случае отсутствия второго элемента [a:] срез будет сделан с позиции первого символа и до конца строки:

        >>> stroka = 'программa'
>>> print(stroka[3:])
граммa

    

Если не указана ни стартовая, ни финальная позиция среза, он будет равен исходной строке:

        >>> stroka = 'позиции не заданы'
>>> print(stroka[:])
позиции не заданы

    

Шаг среза

Помимо диапазона, можно задавать шаг среза. В приведенном ниже примере выбирается символ из стартовой позиции среза, а затем каждая 3-я буква из диапазона:

        >>> stroka = 'Python лучше всего подходит для новичков.'
>>> print(stroka[1:15:3])
yoлшв

    

Шаг может быть отрицательным – в этом случае символы будут выбираться, начиная с конца строки:

        >>> stroka = 'это пример отрицательного шага'
>>> print(stroka[-1:-15:-4])
а нт

    

Срез [::-1] может оказаться очень полезным при решении задач, связанных с палиндромами:

        >>> stroka = 'А роза упала на лапу Азора'
>>> print(stroka[::-1])
арозА упал ан алапу азор А

    

Замена символа в строке

Строки в Python относятся к неизменяемым типам данных. По этой причине попытка замены символа по индексу обречена на провал:

        >>> stroka = 'mall'
>>> stroka[0] = 'b'
Traceback (most recent call last):
  File "<pyshell>", line 1, in <module>
TypeError: 'str' object does not support item assignment

    

Но заменить любой символ все-таки можно – для этого придется воспользоваться срезами и конкатенацией. Результатом станет новая строка:

        >>> stroka = 'mall'
>>> stroka = 'b' + stroka[1:]
>>> print(stroka)
ball

    

Более простой способ «замены» символа или подстроки – использование метода replace(), который мы рассмотрим ниже.

Полезные методы строк

Python предоставляет множество методов для работы с текстовыми данными. Все методы можно сгруппировать в четыре категории:

  • Преобразование строк.
  • Оценка и классификация строк.
  • Конвертация регистра.
  • Поиск, подсчет и замена символов.

Рассмотрим эти методы подробнее.

Преобразование строк

Три самых используемых метода из этой группы – join(), split() и partition(). Метод join() незаменим, если нужно преобразовать список или кортеж в строку:

        >>> spisok = ['Я', 'изучаю', 'Python']
>>> stroka = ' '.join(spisok)
>>> print(stroka)
Я изучаю Python

    

При объединении списка или кортежа в строку можно использовать любые разделители:

        >>> kort = ('Я', 'изучаю', 'Django')
>>> stroka = '***'.join(kort)
>>> print(stroka)
Я***изучаю***Django

    

Метод split() используется для обратной манипуляции – преобразования строки в список:

        >>> text = 'это пример текста для преобразования в список'
>>> spisok = text.split()
>>> print(spisok)
['это', 'пример', 'текста', 'для', 'преобразования', 'в', 'список']

    

По умолчанию split() разбивает строку по пробелам. Но можно указать любой другой символ – и на практике это часто требуется:

        >>> text = 'цвет: синий; вес: 1 кг; размер: 30х30х50; материал: картон'
>>> spisok = text.split(';')
>>> print(spisok)
['цвет: синий', ' вес: 1 кг', ' размер: 30х30х50', ' материал: картон']

    

Метод partition() поможет преобразовать строку в кортеж:

        >>> text = 'Python - простой и понятный язык'
>>> kort = text.partition('и')
>>> print(kort)
('Python - простой ', 'и', ' понятный язык')

    

В отличие от split(), partition() учитывает только первое вхождение элемента-разделителя (и добавляет его в итоговый кортеж).

Оценка и классификация строк

В Python много встроенных методов для оценки и классификации текстовых данных. Некоторые из этих методов работают только со строками, в то время как другие универсальны. К последним относятся, например, функции min() и max():

        >>> text = '12345'
>>> print(min(text))
1
>>> print(max(text))
5


    

В Python есть специальные методы для определения типа символов. Например, isalnum() оценивает, состоит ли строка из букв и цифр, либо в ней есть какие-то другие символы:

        >>> text = 'abracadabra123456'
>>> print(text.isalnum())
True
>>> text1 = 'a*b$ra cadabra'
>>> print(text1.isalnum())
False

    

Метод isalpha() поможет определить, состоит ли строка только из букв, или включает специальные символы, пробелы и цифры:

        >>> text = 'программирование'
>>> print(text.isalpha())
True
>>> text2 = 'password123'
>>> print(text2.isalpha())
False

    

С помощью метода isdigit() можно определить, входят ли в строку только цифры, или там есть и другие символы:

        >>> text = '1234567890'
>>> print(text.isdigit())
True
>>> text2 = '123456789o'
>>> print(text2.isdigit())
False

    

Поскольку вещественные числа содержат точку, а отрицательные – знак минуса, выявить их этим методом не получится:

        >>> text = '5.55'
>>> print(text.isdigit())
False
>>> text1 = '-5'
>>> print(text1.isdigit())
False
    

Если нужно определить наличие в строке дробей или римских цифр, подойдет метод isnumeric():

        >>> text = '½⅓¼⅕⅙'
>>> print(text.isdigit())
False
>>> print(text.isnumeric())
True

    

Методы islower() и isupper() определяют регистр, в котором находятся буквы. Эти методы игнорируют небуквенные символы:

        >>> text = 'abracadabra'
>>> print(text.islower())
True
>>> text2 = 'Python bytes'
>>> print(text2.islower())
False
>>> text3 = 'PYTHON'
>>> print(text3.isupper())
True

    

Метод isspace() определяет, состоит ли анализируемая строка из одних пробелов, или содержит что-нибудь еще:

        >>> stroka = '   '
>>> print(stroka.isspace())
True
>>> stroka2 = '  a  '
>>> print(stroka2.isspace())
False

    

Конвертация регистра

Как уже говорилось выше, строки относятся к неизменяемым типам данных, поэтому результатом любых манипуляций, связанных с преобразованием регистра или удалением (заменой) символов будет новая строка.

Из всех методов, связанных с конвертацией регистра, наиболее часто используются на практике два – lower() и upper(). Они преобразуют все символы в нижний и верхний регистр соответственно:

        >>> text = 'этот текст надо написать заглавными буквами'
>>> print(text.upper())
ЭТОТ ТЕКСТ НАДО НАПИСАТЬ ЗАГЛАВНЫМИ БУКВАМИ
>>> text = 'зДесь ВСе букВы рАзныЕ, а НУжнЫ проПИСНыЕ'
>>> print(text.lower())
здесь все буквы разные, а нужны прописные

    

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

        >>> text = 'предложение должно начинаться с ЗАГЛАВНОЙ буквы.'
>>> print(text.capitalize())
Предложение должно начинаться с заглавной буквы.

    

Методы swapcase() и title() используются реже. Первый заменяет исходный регистр на противоположный, а второй – начинает каждое слово с заглавной буквы:

        >>> text = 'пРИМЕР иСПОЛЬЗОВАНИЯ swapcase'
>>> print(text.swapcase())
Пример Использования SWAPCASE
>>> text2 = 'тот случай, когда нужен метод title'
>>> print(text2.title())
Тот Случай, Когда Нужен Метод Title

    

Поиск, подсчет и замена символов

Методы find() и rfind() возвращают индекс стартовой позиции искомой подстроки. Оба метода учитывают только первое вхождение подстроки. Разница между ними заключается в том, что find() ищет первое вхождение подстроки с начала текста, а rfind() с конца:

        >>> text = 'пример текста, в котором нужно найти текстовую подстроку'
>>> print(text.find('текст'))
7
>>> print(text.rfind('текст'))
37

    

Такие же результаты можно получить при использовании методов index() и rindex() – правда, придется предусмотреть обработку ошибок, если искомая подстрока не будет обнаружена:

        >>> text = 'Съешь еще этих мягких французских булок!'
>>> print(text.index('еще'))
6
>>> print(text.rindex('чаю'))
Traceback (most recent call last):
  File "<pyshell>", line 1, in <module>
ValueError: substring not found

    

Если нужно определить, начинается ли строка с определенной подстроки, поможет метод startswith():

        >>> text = 'Жила-была курочка Ряба'
>>> print(text.startswith('Жила'))
True

    

Чтобы проверить, заканчивается ли строка на нужное окончание, используют endswith():

        >>> text = 'В конце всех ждал хэппи-енд'
>>> print(text.endswith('енд'))
True

    

Для подсчета числа вхождений определенного символа или подстроки применяют метод count() – он помогает подсчитать как общее число вхождений в тексте, так и вхождения в указанном диапазоне:

        >>> text = 'Съешь еще этих мягких французских булок, да выпей же чаю!'
>>> print(text.count('е'))
5
>>> print(text.count('е', 5, 25))
2

    

Методы strip(), lstrip() и rstrip() предназначены для удаления пробелов. Метод strip() удаляет пробелы в начале и конце строки, lstrip() – только слева, rstrip() – только справа:

        >>> text = '    здесь есть пробелы и слева, и справа    '
>>> print('***', text.strip(), '***')
*** здесь есть пробелы и слева, и справа ***
>>> print('***', text.lstrip(), '***')
*** здесь есть пробелы и слева, и справа     ***
>>> print('***', text.rstrip(), '***')
***     здесь есть пробелы и слева, и справа ***
    

Метод replace() используют для замены символов или подстрок. Можно указать нужное количество замен, а сам символ можно заменить на пустую подстроку – проще говоря, удалить:

        >>> text = 'В этой строчке нужно заменить только одну "ч"'
>>> print(text.replace('ч', '', 1))
В этой строке нужно заменить только одну "ч"

    

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

Практика

Задание 1

Напишите программу, которая получает на вход строку и выводит:

  • количество символов, содержащихся в тексте;
  • True или False в зависимости от того, являются ли все символы буквами и цифрами.

Решение:

        text = input()
print(len(text))
print(text.isalpha())

    

Задание 2

Напишите программу, которая получает на вход слово и выводит True, если слово является палиндромом, или False в противном случае. Примечание: для сравнения в Python используется оператор ==.

Решение:

        text = input().lower()
print(text == text[::-1])

    

Задание 3

Напишите программу, которая получает строку с именем, отчеством и фамилией, написанными в произвольном регистре, и выводит данные в правильном формате. Например, строка алеКСандр СЕРГЕЕВИЧ ПушкиН должна быть преобразована в Александр Сергеевич Пушкин.

Решение:

        text = input()
print(text.title())

    

Задание 4

Имеется строка 12361573928167047230472012. Напишите программу, которая преобразует строку в текст один236один573928один670472304720один2.

Решение:

        text = '12361573928167047230472012'
print(text.replace('1', 'один'))

    

Задание 5

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

Пример ввода:

        Алексей
Константинович
Романов
бухгалтер

    

Вывод:

        А. К. Романов, бухгалтер
    

Решение:

        first_name, patronymic, last_name, position = input(), input(), input(), input()
print(first_name[0] + '.', patronymic[0] + '.', last_name + ',', position)

    

Задание 6

Напишите программу, которая получает на вход строку текста и букву, а затем определяет, встречается ли данная буква (в любом регистре) в тексте. В качестве ответа программа должна выводить True или False.

Пример ввода:

        ЗонтИК
к

    

Вывод:

        True
    

Решение:

        text = input().lower()
letter = input()
print(letter in text)

    

Задание 7

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

Решение:

        vowels = 'аиеёоуыэюя'
letter = input().lower()
print(letter in vowels)

    

Задание 8

Напишите программу, которая принимает на вход строку текста и подстроку, а затем выводит индексы первого вхождения подстроки с начала и с конца строки (без учета регистра).

Пример ввода:

        Шесть шустрых мышат в камышах шуршат
ша

    

Вывод:

        16 33
    

Решение:

        text, letter = input().lower(), input()
print(text.find(letter), text.rfind(letter))

    

Задание 9

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

Пример ввода:

        В роще, травы шевеля, мы нащиплем щавеля
    

Вывод:

        Количество пробелов: 6, количество других символов: 34
    

Решение:

        text = input()
nospace = text.replace(' ', '')
print(f"Количество пробелов: {text.count(' ')}, количество других символов: {len(nospace)}")

    

Задание 10

Напишите программу, которая принимает строку и две подстроки start и end, а затем определяет, начинается ли строка с фрагмента start, и заканчивается ли подстрокой end. Регистр не учитывать.

Пример ввода:

        Программирование на Python - лучшее хобби
про
про

    

Вывод:

        True
False

    

Решение:

        text, start, end = input().lower(), input(), input()
print(text.startswith(start))
print(text.endswith(end))

    

Подведем итоги

В этой части мы рассмотрели самые популярные методы работы со строками – они пригодятся для решения тренировочных задач и в разработке реальных проектов. В следующей статье будем разбирать методы работы со списками.

***

📖 Содержание самоучителя

  1. Особенности, сферы применения, установка, онлайн IDE
  2. Все, что нужно для изучения Python с нуля – книги, сайты, каналы и курсы
  3. Типы данных: преобразование и базовые операции
  4. Методы работы со строками
  5. Методы работы со списками и списковыми включениями
  6. Методы работы со словарями и генераторами словарей
  7. Методы работы с кортежами
  8. Методы работы со множествами
  9. Особенности цикла for
  10. Условный цикл while
  11. Функции с позиционными и именованными аргументами
  12. Анонимные функции
  13. Рекурсивные функции
  14. Функции высшего порядка, замыкания и декораторы
  15. Методы работы с файлами и файловой системой
  16. Регулярные выражения
  17. Основы скрапинга и парсинга
  18. Основы ООП: инкапсуляция и наследование
  19. Основы ООП – абстракция и полиморфизм
  20. Графический интерфейс на Tkinter

***

Материалы по теме

  • ТОП-15 трюков в Python 3, делающих код понятнее и быстрее

12 ответов

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

bgporter
22 дек. 2010, в 17:11

Поделиться

Вот лучший и более гибкий способ, 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}

Anurag Uniyal
22 дек. 2010, в 17:31

Поделиться

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

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

Paulo Scardine
22 дек. 2010, в 17:45

Поделиться

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

Christian
22 дек. 2010, в 17:01

Поделиться

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

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

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

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

alukach
15 нояб. 2013, в 19:22

Поделиться

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

kindall
22 дек. 2010, в 19:28

Поделиться

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

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

Massimiliano Torromeo
22 дек. 2010, в 15:40

Поделиться

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

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

marcog
22 дек. 2010, в 15:37

Поделиться

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

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

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

idxs[0]

Steven Eckhoff
02 май 2018, в 21:47

Поделиться

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

import re
y = "xdtwkeltjwlkejt7wthwk89lk"

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

cherhan
22 дек. 2010, в 17:03

Поделиться

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

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

Jacobo de Vera
15 авг. 2014, в 10:40

Поделиться

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

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

michael toback
21 янв. 2014, в 17:49

Поделиться

Ещё вопросы

  • 0SQLPro или PostgreSQL SQL обновление строки на основе предыдущего значения строки
  • 1Раскраска арабского текста в Textview выглядит отдельно
  • 0Chrome не отражает css на моем компьютере, но другие хромы работают правильно
  • 0Google войти с помощью angularjs
  • 1Angular 2 Host Listener Change div heigtht
  • 1Ошибка при установке приложения express.js Node.js
  • 0Набор символов Liquibase MySQL для изменения таблицы
  • 0Объект Javascript: область видимости переменной экземпляра
  • 1Как правильно изменить или удалить объект из области?
  • 0Получить идентификатор отмеченных флажков в списке одним нажатием кнопки
  • 1Кросс-компиляция платформ
  • 0Запуск 2 xampp на том же локальном компьютере
  • 1Больше информации об ошибке + более длинная программа или меньше информации об ошибке + более короткая программа?
  • 1Почему этот код JavaScript допустим и работает с запятыми в квадратных скобках? [Дубликат]
  • 1Использование универсального типа ‘System.Collections.Generic.IEnumerable <T> требует аргументов 1 типа
  • 1Получение нескольких подстрок из одной строки C #
  • 1стоимость объекта группы lodash json
  • 1Переменная класса NameError не определена python
  • 0Rightsidebar начинается с нижней части содержимого в div содержимого
  • 0Различия между EER и UML
  • 1создать вычтенный фрейм данных, используя несколько значений из нижних строк
  • 0Когда флажок установлен, отключите текстовые поля
  • 1Создание буквенного текстового блока в Sphinx
  • 1Чтение символов в фоновом приложении
  • 1Выдать URL при нажатии кнопки, когда она работает в фоновом режиме
  • 0Извлечь из таблицы на основе значения префикса
  • 1Обращение к члену в качестве переменной в Discord.py
  • 0Рекурсивно создать дерево
  • 0ASP.NET MVC4 проверка подлинности телефонного промежутка
  • 0Взяв данные из файла и поместив их в структуру
  • 1C # AsyncSockets, куда отправлять данные без получения данных раньше?
  • 0HTML-таблица и выравнивание границ
  • 0Проблема отправки писем в php [дубликаты]
  • 1Ошибка говорит «настроить на использование jdk», хотя eclipse использует свой собственный компилятор. Что может быть причиной этого?
  • 1Пользовательская сериализация gemfire не помогает
  • 0Regex Lookahead проблема и улучшение
  • 0Конвертировать массив php в гораздо меньший json?
  • 0Как разместить невидимый вход в каждой ячейке таблицы
  • 1Связь супервизора в шторме 0.9.0.1 с Netty
  • 0Как мне явно выполнять задачи?
  • 0как сделать ссылку на изображение php открытой в новом окне
  • 1Как правильно авторизовать Google Static Map API
  • 1Как передать дополнительные аргументы объекту сервиса Google Pagespeed API
  • 0Проблемы с загрузкой формы PHP
  • 1Динамическое связывание массивов
  • 0Вставьте, если существует
  • 1Создание линии с помощью кнопок TicTacToe
  • 1Пост-сборка Dotfuscator для проекта визуальной настройки студии VS 2010
  • 1HTML письмо с ссылкой на изображение в виде base64 String
  • 1получение покрытия кода через specflow

Добавить комментарий