Поиск в строке

s591962

Новичок
Пользователь
Окт 12, 2021
130
3
18
Есть строка. При ее переборе нужно найти определенное слово и запустить функцию по его замене каким то другим исходя из условий.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
но если в вашем коде слово окажется частью слова, то все равно результат будет странный
Это происходит из-за изменения текста с помощью replace.
Чтобы изменения не затрагивали другие слова лучше записывать результат в другой список, а потом собирать из него измененный текст:
Python:
def func1(s):
    r = {
        'то': '12',
        'текст': 'документ'
    }
    return r[s]


def func2(s):
    return ''


def func3(s):
    return s.upper()


# словарь со словами для обработки и функциями-обработчиками
dict_ = {
    'то': func1,
    'какой-то': func2,
    'большой': func3,
    'текст': func1
}

text = 'это какой-то большой текст то'

# список для преобразованных слов
text2 = []
# делим текст на слова по пробелам и проходим по ним в цикле
for s in text.split():
    # если слово есть в словаре dict_ то
    # добавляем в список text2 результат функции-обработчика
    # если слова нет в словаре
    # добавляем его в список text2 без изменений
    text2.append(dict_[s](s) if dict_.get(s) else s)

# собираем текст из списка слов после обработки
text = ' '.join([s for s in text2 if s])
print(text)
 
  • Мне нравится
Реакции: Student

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 599
464
83
Python:
s = "Есть строка"

if s.find("строка") != -1:
    s = s.replace("строка", "новая строка")

print(s)
 

Ципихович Эндрю

Активный пользователь
Пользователь
Мар 27, 2021
490
25
28
find() и count() скажите какая в них разница? спасибо
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 599
464
83
find() и count() скажите какая в них разница? спасибо
count возвращает количество повторений подстроки в строке, если подстрока не найдена, возвращает 0
find возвращает индекс первого символа подстроки в строке, если подстрока не найдена, возвращает -1
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
933
208
43
20
Москва
Python:
s = "Есть строка"

if s.find("строка") != -1:
    s = s.replace("строка", "новая строка")

print(s)
А проще так:
Код:
s = "Есть строка"

s = s.replace("строка", "новая строка")

print(s)

(если строки нет, он все равно ее не заменит)
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 599
464
83
А проще так:
Код:
s = "Есть строка"

s = s.replace("строка", "новая строка")

print(s)

(если строки нет, он все равно ее не заменит)
у ТСа в задании найти и заменить...
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
933
208
43
20
Москва
у ТСа в задании найти и заменить...
replace ведь это и делает, находит и заменяет...
(Вот если-бы позиция искомого слова использовалась, то точно нужен find, а так в принципе можно без него)
 

s591962

Новичок
Пользователь
Окт 12, 2021
130
3
18
Python:
s = "Есть строка"

if s.find("строка") != -1:
    s = s.replace("строка", "новая строка")

print(s)
Видимо я не точно сформулировал вопрос. Необходимо при переборе текста и обнаружении определенного слова запустить определенную функцию работающую с этим словом в зависимости от условий. Спасибо.
 

Ципихович Эндрю

Активный пользователь
Пользователь
Мар 27, 2021
490
25
28
так приводите пример условий-то, их же тьма.........
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 599
464
83
Видимо я не точно сформулировал вопрос. Необходимо при переборе текста и обнаружении определенного слова запустить определенную функцию работающую с этим словом в зависимости от условий. Спасибо.
все равно ничего не понятно...
 

s591962

Новичок
Пользователь
Окт 12, 2021
130
3
18
все равно ничего не понятно...
Перебирается текст Если находится слово №1 запускается функция замены его на другое слово, если обнаруживается слово №2 оно просто удаляется. Если обнаруживается слово №3 оно пишется заглавными буквами.
 

Ципихович Эндрю

Активный пользователь
Пользователь
Мар 27, 2021
490
25
28
и что не получается?
 

s591962

Новичок
Пользователь
Окт 12, 2021
130
3
18
Не могу соединить перебор текста и вызов функции. Функция пишется отдельно и вызывается по имени.
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
933
208
43
20
Москва
Python:
def func1(t):
    return ' :-) '


def func2(t):
    return str(t * 2)


di = {
        func1 : ['это', 'то'],
        func2 : ['как'],
        (lambda x: x.upper()) : ['текст']
         }
text = 'это какой-то текст'


for f in di:
    for v in di[f]:
        text = text.replace(v, '1')

print(text)
 

s591962

Новичок
Пользователь
Окт 12, 2021
130
3
18
Python:
def func1(t):
    return ' :-) '


def func2(t):
    return str(t * 2)


di = {
        func1 : ['это', 'то'],
        func2 : ['как'],
        (lambda x: x.upper()) : ['текст']
         }
text = 'это какой-то текст'


for f in di:
    for v in di[f]:
        text = text.replace(v, '1')

print(text)
Спасибо Но это не совсем то что нужно. Нужно чтобы это заменялось на то, вместо как было каккак а слово текст писалось заглавными. Здесь же как я понимаю, функции func1(t): и func2(t): только обозначаются но не вызываются. А мне нужно чтобы вызывалась функция при обнаружении слова в тексте.
 
Последнее редактирование:

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Перебирается текст Если находится слово №1 запускается функция замены его на другое слово, если обнаруживается слово №2 оно просто удаляется. Если обнаруживается слово №3 оно пишется заглавными буквами.
Вот пример:
Python:
def func1(s):
    r = {
        'это': 'то',
        'текст': 'документ'
    }
    return r[s]


def func2(s):
    return ''


def func3(s):
    return s.upper()


# словарь со словами для обработки и функциями-обработчиками
dict_ = {
    'это': lambda x: func1(x),
    'какой-то': lambda x: func2(x),
    'большой': lambda x: func3(x),
    'текст': lambda x: func1(x)
}

text = 'это какой-то большой текст'

# делим текст на слова по пробелам и проходим по ним в цикле
for s in text.split():
    # если слово есть в словаре, то вызывается соответствующая функция
    if s in dict_:
        # замена слова в тексте на результат вызова функции
        text = text.replace(s, dict_[s](s), 1)

text = text.replace('  ', ' ')  # убираем лишние пробелы из текста
print(text)
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
933
208
43
20
Москва
Спасибо Но это не совсем то что нужно. Нужно чтобы это заменялось на то, вместо как было каккак а слово текст писалось заглавными. Здесь же как я понимаю, функции func1(t): и func2(t): только обозначаются но не вызываются. А мне нужно чтобы вызывалась функция при обнаружении слова в тексте.
А, мда, после отладки не изменил самое важное:
Python:
def func1(t):
    return ' :-) '


def func2(t):
    return str(t * 2)


di = {
        func1 : ['это', 'то'],
        func2 : ['как'],
        (lambda x: x.upper()) : ['текст']
         }
text = 'это какой-то текст'


for f in di:  # Проходимся по всем функциям словаря
    for v in di[f]:  # Смотрим к каким словам надо применить указанную функцию
        text = text.replace(v, f(v))  # Забыл тут поменять на что менять

print(text)
 
Последнее редактирование:

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
933
208
43
20
Москва
Вот пример:
Python:
def func1(s):
    r = {
        'это': 'то',
        'текст': 'документ'
    }
    return r[s]


def func2(s):
    return ''


def func3(s):
    return s.upper()


# словарь со словами для обработки и функциями-обработчиками
dict_ = {
    'это': lambda x: func1(x),
    'какой-то': lambda x: func2(x),
    'большой': lambda x: func3(x),
    'текст': lambda x: func1(x)
}

text = 'это какой-то большой текст'

# делим текст на слова по пробелам и проходим по ним в цикле
for s in text.split():
    # если слово есть в словаре, то вызывается соответствующая функция
    if s in dict_:
        # замена слова в тексте на результат вызова функции
        text = text.replace(s, dict_[s](s), 1)

text = text.replace('  ', ' ')  # убираем лишние пробелы из текста
print(text)
А почему словарь не такой?
JSON:
dict_ = {
    'это': func1,
    'какой-то': func2,
    'большой': func3,
    'текст': func1
}

И просто ради уточнения, я писал у себя функции в ключи словаря, чтобы если будет 10 слов к которым надо применить функцию, не создавать 10 элементов словаря, а просто указать функцию как ключ и список слов как значение
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
А почему словарь не такой?
Просто сначала сделал на лямбдах, потом добавил функции чтобы было понятней, а лямбды не убрал. Вариант с функциями смотрится лучше.
У вас в коде тоже лямбду можно заменить на функцию:
Python:
di = {
    func1 : ['это', 'то'],
    func2 : ['как'],
    str.upper : ['текст']
}
И просто ради уточнения, я писал у себя функции в ключи словаря, чтобы если будет 10 слов к которым надо применить функцию, не создавать 10 элементов словаря, а просто указать функцию как ключ и список слов как значение
Слова в ключах для наглядности чтобы показать что для обработки конкретного слова можно привязать функцию. Также мой код меняет конкретное слово в тексте на другое (которое указано для замены), а не все вхождения этого слова (возможно не нужно менять вхождение слова если оно является частью другого слова).
 

s591962

Новичок
Пользователь
Окт 12, 2021
130
3
18
Просто сначала сделал на лямбдах, потом добавил функции чтобы было понятней, а лямбды не убрал. Вариант с функциями смотрится лучше.
У вас в коде тоже лямбду можно заменить на функцию:
Python:
di = {
    func1 : ['это', 'то'],
    func2 : ['как'],
    str.upper : ['текст']
}

Слова в ключах для наглядности чтобы показать что для обработки конкретного слова можно привязать функцию. Также мой код меняет конкретное слово в тексте на другое (которое указано для замены), а не все вхождения этого слова (возможно не нужно менять вхождение слова если оно является частью другого слова).
Изменил на
Код:
def func1(t):
    return 'ток'


def func2(t):
    return str(t * 2)

def func3(t):
    return str.upper

di = {
    func1 : ['это', 'то'],
    func2 : ['как'],
    func3 : ['текст']
}
text = 'это какой-то текст'


for f in di:  # Проходимся по всем функциям словаря
    for v in di[f]:  # Смотрим к каким словам надо применить указанную функцию
        text = text.replace(v, f(v))  # Забыл тут поменять на что менять

print(text)
Почему то приводя строку в верхний регистр получаем не строку.
 

Форум IT Специалистов