Поиск в строке python: python — Поиск подстроки в строке

python — поиск в строке которая задана переменной

Вопрос задан

Изменён 1 год 7 месяцев назад

Просмотрен 159 раз

задача: из строки которая задана переменной извлечь символы с 15 по 25 (символы в будущем для других строк будут меняться), ищу способом find (), полный код программы прилагается

# -*- coding: utf-8 -*-
import setuptools
name: str = input ("Введите имя входящего файла: ")
f = open (name, "r")  # открываем файл
lines = f.readlines ()  # читаем его построчно
t1 = lines [6]
t2 = lines [-5]
t3 = lines [-6]
# -------- поиск в строке
t1.find ('t1', [1], [2]) #----проблема возникает тут!!!!  
a=t1.find
# --------
for line in lines:
    if line.find ('НА НР') != -1:  # то что ищем
        t4 = line [7:40]  # определяет глубину
        print (t4)  # выводим на экран проверяем
        break
name1: str = input ("Введите имя исходящего файла: ")
f = open (name1, "w+")
# f.
write(str(t1 + "\n" + t2)) f.write ('реквизит верхний// ' + str (a)) f.write ('реквизит нижний// ' + str (t2)) f.write ('дата// ' + str (t3)) f.write ('\nнанр// ' + str (t4)) f.close ()

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

  • python
  • python-3.x
  • строки
  • парсер
  • методы

8

короткий ответ:

s = "Hello world!"
# Срез строки s[индекс_начала_среза:индекс_конца_среза]
# Срез делается по конечный индекс то есть не включительно
print(s[1:4])
# сохранение в переменную
sub_string = s[0:6]
print(sub_string)
# поиск подстроки
start_index = s.find('Hello')
print(start_index)
# .find() возвращает индекс где начинается искомая подстрока
# если вернул -1 значит подстрока не найдена
# то есть если start_index != -1 то подстрока найдена.

Но я на вашем месте изучил бы статью по ссылке. Там все очень доходчиво объяснено про то как работать со строками.
https://pythonworld.ru/tipy-dannyx-v-python/stroki-funkcii-i-metody-strok.html

Так же, как немного углубитесь, внимательно изучите вот это https://pythonworld.ru/osnovy/vstroennye-funkcii.html и настоятельно рекомендую позапускать каждую команду из списка приведенного по этой ссылке. Это то что вы будете использовать и/или видеть очень часто. Понимать как это работает просто необходимо.

Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации

Почта

Необходима, но никому не показывается

Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки

алгоритм — Поиск подстрок в строках списков на Python

Trie или префиксное дерево хорошо подходит для решения задачи. Это дерево для набора строк. В корне хранится dict со всеми возможными первыми символами строк. В узлах внутри тоже хранятся словари с буквами, которыми можно продолжить строку. Признак конца строки — пустой ключ в словаре. Пример:

import pprint
def make_trie(iterable):
    root = {}
    for s in iterable:
        node = root
        for c in s:
            node = node.setdefault(c, {})
        node[''] = None
    return root
pprint.pprint(make_trie(('then', 'than', 'thing', 'those')))
{'t': {'h': {'a': {'n': {'': None}},
             'e': {'n': {'': None}},
             'i': {'n': {'g': {'': None}}},
             'o': {'s': {'e': {'': None}}}}}}

С помощью префиксного дерева можно проверить, что данный текст содержит какое-нибудь слово из дерева.

Например, чтобы проверить что строка есть в дереве, будем брать из неё символы по одному и спускаться по дереву:

s = ...              # строка которую ищем в дереве
node = root          # корень префиксного дерева
for c in s:          # символ за символом . ..
    node = node[c]   # ... спускаемся по дереву

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

Так как нам надо проверять не только начало текста, но и любое место внутри, то будем поддерживать список узлов, которые действительны на данном символе. С каждым новым символом текста список пополняется новым элементом — корнем дерева. Все узлы, которые не соответствуют очередному символу из списка удаляются. Чтобы эти операции были быстрыми приходится работать с индексами, что не привычно для Питона:

def contains(text, trie):
    if '' in trie:
        return True
    nodes = []
    for c in text:
        nodes.append(trie)  # анализируем строку, которая начинается на этом символе
        i = 0
        while i < len(nodes):
            node = nodes[i]
            if c in node:
                # спуск по дереву
                node = node[c]
                nodes[i] = node
                if '' in node:  # признак конца строки в trie
                    return True
                i += 1
            else:
                # удаляем узел из списка
                nodes[i] = nodes[-1]
                nodes. pop()
    return False

Для проверки эффективности trie были изготовлены тестовые данные. Скрипт generate_sample.py готовит файл со строками для поиска (50’000 строк от 10 до 20 символов) …

...
uctufrxhfomiuwrhvkyy
hbzkmicgsw
gupmuoeiehxrrix
nsmlheqpcybdeufzvnt
mmtoqiravxd
...

… и текст в котором они ищутся (20’000 строк длиной от 20 до 100 символов) …

...
oeosbugxnbfvqgfonutgbzrmmuzumrglpphrqritsiwavmwfvdamrlvulfjswnuzsrhikfybbzxajlfxwhtt
qizjtyarlbiwnstvtmrqqomblafkhmvwtiocelcyczobausadcudkzykcgyzwajxzkbdwytlnxdqxxycgsdwsyqtn
xtwlvjyxcisvvbvacljxzmdjrhsueyjffdd
wyctzgitvbzroiiquohbfostrsvvrorslfevbyhrxqadpytrswk
fwxeyfmkqavccxgjrtjsikpazaajpknqiizbpbweublcowani
...

В текст с некоторой вероятностью вставлены слова из словаря, чтобы иногда что-то находилось.

Оригинальный поиск на этих данных выполняется 112 секунд. baseline.py:

with open('patterns.txt') as f:
    patterns = tuple(line. replace('\n','') for line in f)
with open('corpus.txt') as f:
    for line in f:
        for p in patterns:
            if p in line:
                print(line, end='')
                break

Поиск с помощью trie около двух секунд. trie.py:

def make_trie(iterable):
    ...
def contains(text, trie):
    ...
with open('patterns.txt') as f:
    trie = make_trie(line.replace('\n', '') for line in f)
with open('corpus.txt') as f:
    for line in f:
        line = line.replace('\n','')
        if contains(line, trie):
            print(line)

Так как обработка посимвольная, то Питон не лучший кандидат для быстрого решения. Решение на C или C++ должно работать быстрее раз в 10-20 если не больше.

Метод Python String find()

Сохранить статью

  • Уровень сложности: Базовый
  • Последнее обновление: 31 января 2023 г.

  • Читать
  • Обсудить
  • Улучшить статью

    Сохранить статью

    Метод Python String find()

    возвращает наименьший индекс или первое вхождение подстроки, если она найдена в данной строке. Если он не найден, то возвращается -1.

    Синтаксис: str_obj.find(sub, start, end)

    Параметры:  

    • sub: Подстрока, которую необходимо найти в заданной строке.
    • начало (необязательно): Начальная позиция, в которой необходимо проверить подстроку в строке.
    • конец (необязательно): Конечная позиция — это индекс последнего значения для указанного диапазона. Исключается при проверке.

    Возврат:  Возвращает наименьший индекс подстроки, если она найдена в заданной строке. Если он не найден, он возвращает -1.

    Python String find() method Example

    Python3

    word = 'geeks for geeks'

    print (word. find( 'for' ))

    Выход:

     6 

    Временная сложность: O(n)

    Вспомогательный пробел: O(1)

    Примечание:

    1. Если начальный и конечный индексы не указаны, то по умолчанию в качестве начального и конечного индексов используются 0 и длина-1, тогда как конечные индексы не включены в наш поиск.
    2. Метод find() аналогичен index(). Единственное отличие заключается в том, что find() возвращает -1, если искомая строка не найдена, и index() в этом случае выдает исключение.

    Пример 1: find() без начального и конечного аргумента

    Python3

    Слово = 'Ванхики для гик

    РЕЗУЛЬТАТ =

    =

    =

    . ( "Substring 'geeks' found at index:" , result)

     

    result = word.find( 'for' )

    Печать ( "Подстроение" для "найдено в индексе:" , результат)

    IF Word.find ( 'Pawan' )! = - 1 :

         print ( "Contains given substring " )

    else :

         print ( "Не содержит заданной подстроки" )

    Вывод:

     Подстрока 'geeks' найдена по индексу: 0
    Подстрока for найдена по индексу: 6
    Не содержит заданной подстроки 

    Временная сложность: O(n)

    Вспомогательный пробел: O(1)

    Пример 2: find() С начальным и конечным аргументами

    В этом примере мы указали начальный и конечный аргументы метода Python String find(). Так что данная подстрока ищется в указанной части исходной строки.

    Python3

    word = 'geeks for geeks'

     

    print (word.find( 'ge' , 2 ))

    Печать (Word.find ( 'Fanting' , 2 )

    9003

    . , 4 , 10 ))

     

    print (word.find( 'for ' , 4 , 11 ))

    Выход:

     10
    -1
    -1
    6 

    Объяснение:

    • В первом операторе вывод равен 10, так как задано начальное значение, равное 2, поэтому подстрока проверяется по второму индексу, который называется «eks for geeks».
    • Во втором операторе начальное значение задано как 2, а подстрока задана как «выродки», поэтому индексная позиция «выродки» равна 10, но из-за того, что последнее значение исключается, будет найдено только «выродок», который не совпадает с исходной строкой, поэтому вывод равен -1.
    • В третьем операторе начальное значение = 4, конечное значение = 10 и задана подстрока = ‘g’, позиция индекса из 4 будет проверена для данной подстроки, которая находится в позиции 10, которая исключается, поскольку она является конечным индексом.
    • В четвертом операторе задано начальное значение = 4, конечное значение = 11 и подстрока = ‘for’, позиция индекса с 4 по 11 будет проверена для данной подстроки, и указанная подстрока присутствует в индексе 6, так получается вывод.

    Статьи по теме

    Метод Python String find() с примерами

    Что такое Python String find()?

    Python String find() — это функция, доступная в библиотеке Python, для поиска индекса первого вхождения подстроки в заданной строке. Строковая функция find() вернет -1 вместо того, чтобы генерировать исключение, если указанная подстрока отсутствует в данной строке.

    В этом учебнике по методу Python string find() вы узнаете:

    • Что такое Python String find()?
    • Синтаксис строки Python find()
    • Пример метода find() со значениями по умолчанию
    • Пример find() с использованием начального аргумента
    • Пример find() с использованием начального и конечного аргументов
    • Пример метода find() Чтобы найти позицию заданной подстроки в строке
    • Строка Python rfind()
    • Индекс строки Python()
    • Чтобы найти общее количество вхождений подстроки

    Синтаксис строки Python find()

    Базовый синтаксис функции find() Python следующий:

     string.find(substring,start,end)
     

    Параметры для метода find()

    Вот три параметра функции String find() в Python:

    • substring : Подстрока, которую вы хотите найти в заданной строке.
    • start : (необязательно) Начальное значение, с которого начнется поиск подстроки. По умолчанию это 0,
    • end : (необязательно) Конечное значение, на котором заканчивается поиск подстроки. По умолчанию значением является длина строки.

    Пример метода find() со значениями по умолчанию

    Параметры, передаваемые методу Python find(), представляют собой подстроку, т. е. строку, которую вы хотите найти, начало и конец. Начальное значение по умолчанию равно 0, а конечное значение — длина строки.

    В этом примере мы будем использовать метод find() в Python со значениями по умолчанию.

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

    Пример:

     mystring = "Знакомьтесь, сайт учебных пособий Guru99. Лучший сайт для учебных пособий по Python!"
    print("Учебники находятся по адресу:", mystring. find("Учебники"))
     

    Вывод:

     Позиция Учебников: 12
     

    Пример find() с использованием начального аргумента

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

    В примере начальная позиция будет указана как 15, а метод find() в Python начнет поиск с позиции 15. Здесь конечной позицией будет длина строки, и поиск будет выполняться до конца строки с 15 позиций и далее.

    Пример:

     mystring = "Знакомьтесь, сайт учебных пособий Guru99. Лучший сайт для учебных пособий по Python!"
    print("Учебники находятся в:", mystring.find("Учебники", 20))
     

    Выход:

     Позиция Учебников на 48
     

    Пример find() с использованием начального и конечного аргументов

    Используя начальный и конечный параметры, мы попытаемся ограничить поиск вместо поиска всей строки.

    Пример:

     mystring = "Знакомьтесь, сайт учебных пособий Guru99.  Лучший сайт для учебных пособий по Python!"
    print("Учебники находятся по адресу:", mystring.find("Учебники", 5, 30))
     

    Вывод:

     Позиция Учебников на 12
     

    Пример метода find() Чтобы найти позицию заданной подстроки в строке

    Мы знаем, что find() помогает нам найти индекс первого вхождения подстроки. Возвращает -1, если подстрока отсутствует в заданной строке. В приведенном ниже примере показан индекс, когда строка присутствует, и -1, когда мы не находим искомую подстроку.

    Пример:

     mystring = "Знакомьтесь, Гуру99 Сайт учебных пособий. Лучший сайт для учебных пособий по Python!»
    print("Позиция лучшего сайта:", mystring.find("Лучший сайт", 5, 40))
    print("Позиция Guru99:", mystring.find("Guru99", 20))
     

    Вывод:

     Позиция Лучшего сайта: 27
    Позиция Guru99: -1
     

    Строка Python rfind()

    Функция Python rfind() аналогична функции find() с той лишь разницей, что rfind() дает наивысший индекс для заданной подстроки, а find() дает наименьший, т. е. самый первый индекс. И rfind(), и find() вернут -1, если подстрока отсутствует.

    В приведенном ниже примере у нас есть строка «Познакомьтесь с учебным сайтом Guru99. Лучший сайт для учебников по Python!» и попытается найти позицию подстроки Tutorials, используя find() и rfind(). Вхождение Tutorials в строку дважды.

    Вот пример, где используются и find(), и rfind().

     mystring = "Знакомьтесь, сайт учебных пособий Guru99. Лучший сайт для учебных пособий по Python!"
    print("Позиция Tutorials используя find() : ", mystring.find("Tutorials"))
    print("Позиция туториалов с помощью rfind() : ", mystring.rfind("туториалы"))
     

    Вывод:

     Позиция учебников с использованием find() : 12
    Позиция учебников с использованием rfind(): 48
     

    Вывод показывает, что find() возвращает индекс самой первой подстроки Tutorials, которую он получает, а rfind() дает последний индекс подстроки Tutorials.

    Python string index()

    Python string index() — это функция, которая дает вам позицию подстроки, заданной точно так же, как find(). Единственная разница между ними заключается в том, что index() выдаст исключение, если подстрока отсутствует в строке, а find() вернет -1.

    Вот рабочий пример, демонстрирующий поведение функций index() и find().

     mystring = "Знакомьтесь, сайт учебных пособий Guru99. Лучший сайт для учебных пособий по Python!"
    print("Позиция Tutorials используя find() : ", mystring.find("Tutorials"))
    print("Позиция туториалов с помощью index() : ", mystring.index("туториалы"))
     

    Вывод:

     Позиция учебников с использованием find() : 12
    Позиция учебников с использованием index(): 12
     

    Мы получаем одинаковое положение как для find(), так и для index(). Давайте рассмотрим пример, когда заданная подстрока отсутствует в строке.

     mystring = "Знакомьтесь, сайт учебных пособий Guru99. Лучший сайт для учебных пособий по Python!"
    print("Позиция Tutorials используя find() : ", mystring.find("test"))
    print("Позиция учебников с использованием index() : ", mystring. index("test"))
     

    Вывод:

     Позиция учебников с использованием find() : -1
    Traceback (последний последний вызов):
      Файл «task1.py», строка 3, в 
        print("Позиция учебников с использованием index() : ", mystring.index("test"))
    ValueError: подстрока не найдена
     

    В приведенном выше примере мы пытаемся найти позицию подстроки «тест». Подстрока отсутствует в заданной строке, и, следовательно, с помощью find() мы получаем позицию как -1, но для index() она выдает ошибку, как показано выше.

    Чтобы найти общее количество вхождений подстроки

    Чтобы найти общее количество раз, когда подстрока встречается в данной строке, мы будем использовать функцию find() в Python. Будет перебирать строку, используя цикл for от 0 до конца строки. Будет использовать параметр startIndex для find().

    Переменные startIndex и count будут инициализированы до 0. Внутри цикла for проверит, присутствует ли подстрока внутри строки, заданной с помощью find() и startIndex как 0.

    Значение, возвращаемое из find(), если не -1, обновит startIndex до индекса, в котором найдена строка, а также увеличит значение счетчика.

    Вот рабочий пример:

     my_string = "тест тестовой строки, тестирование тестовой строки, тестовая строка тестовой строки"
    начальный индекс = 0
    количество = 0
    для i в диапазоне (len (my_string)):
        k = my_string.find('test', startIndex)
        если (к != -1):
            начальный индекс = k+1
            количество += 1
            к = 0
    print("Общее количество тестов подстроки: ", count )
     

    Вывод:

     Общее количество тестов подстроки: 6
     

    Резюме

    • Метод Python string find() помогает найти индекс первого вхождения подстроки в заданную строку. Он вернет -1, если подстрока отсутствует.
    • Параметры, переданные методу поиска подстроки Python, являются подстрокой, т. е. строкой, которую вы хотите найти, начать и закончить. Начальное значение по умолчанию равно 0, а конечное значение — длина строки.
    Оставить комментарий

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

    Ваш адрес email не будет опубликован. Обязательные поля помечены *