Замена в строке с помощью Python
Большая просьба помочь. У меня есть несколько одинаковых слов в строке. Нужно произвести замену лишь некоторых из этих одинаковых слов. В питоне есть метод: S.replace(old, new) — заменить в строке S ВСЕ ВХОЖДЕНИЯ подстроки old на подстроку new. А если мне надо заменить не все, а например пятое или третье, то как быть. S.replace(old[5], new) — вот так не работает. все равно во всех заменяет. Неужели в питоне нет решений для казалось бы такой простой задачи??
cdi1989
18.08.15 14:07:34 MSK

Вообще re.sub для этого лучше использовать, а так можешь и по строке как по массиву пробежаться.
alozovskoy ★★★★★
( 18.08.15 14:13:55 MSK )

Делай поиск слова в строке, пока не найдешь нужное смещение.
panter_dsd ★★★★
( 18.08.15 14:17:58 MSK )
Ответ на: комментарий от alozovskoy 18.08.15 14:13:55 MSK
sub тоже ищет все совпадения, как и replace. Ну неужели не реализована возможность замены только того, что нужно((
cdi1989
( 18.08.15 14:21:41 MSK ) автор топика
Ответ на: комментарий от cdi1989 18.08.15 14:21:41 MSK

sub умеет в регулярки. Разбей строку на подстроки, замени нужные подстроки и объедини обратно.
alozovskoy ★★★★★
( 18.08.15 14:22:39 MSK )
Ответ на: комментарий от cdi1989 18.08.15 14:21:41 MSK

pos = 0 s = '-------' replace_text = '-------' for i in range(5): pos = s.find(replace_text, pos) s = s[:pos] + 'some_new_text' + s[pos+len(replace_text):]
На примерно то, что нужно сделать. Тестируй, могут быть баги, не проверял. Обязательно сделай бэкап!
panter_dsd ★★★★
( 18.08.15 14:24:41 MSK )
Неужели в питоне нет решений для казалось бы такой простой задачи??
А в каком языке есть?
pi11 ★★★★★
( 18.08.15 14:27:47 MSK )
Ответ на: комментарий от pi11 18.08.15 14:27:47 MSK
"string".gsub "str","k" #=> "king"
nikolnik ★★★
( 18.08.15 14:31:52 MSK )
Python 3.4.2 (v3.4.2:ab2c023a9432, Oct 6 2014, 22:15:05) [MSC v.1600 32 bit (In tel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import re >>> s = 'test 123 test 456 test 789 test 0 test' >>> # replace 2'nd and 5'th test by TEST . >>> re.sub('(.*test.*)(test)(.*test.*test.*)(test)(.*)', r'\1TEST\3TEST\5', s) 'test 123 TEST 456 test 789 test 0 TEST' >>>
Если я правильно понял, что тебе нужно.
winlook38 ★★
( 18.08.15 14:36:47 MSK )
Ответ на: комментарий от nikolnik 18.08.15 14:31:52 MSK
Вау. Ты оп-пост читал?
pi11 ★★★★★
( 18.08.15 14:43:33 MSK )
Python не имеет встроенных функций управления алгоритмом поиска, так сказать event-driven functions. Обычно такое пишется «на коленке».
# -*- coding: utf-8 -*- s = "abc 123 abc 345 abc ABC def ABC abc abc" import re def fr(s,subs,n): f = re.compile("abc") b = "" # начало строки for i in xrange(n): r = f.search(s) if r == None: print "None"; continue k1 = r.start() k2 = r.end() if i == n-1: print b+s[:k1]+"---"+s[k2:] # на последней итерации b = b + s[:k2] # наращиваем начало s = s[k2:] # остается после i-го найденного фрагмента fr(s,"abc",3) fr(s,"abc",5) fr(s,"abc",6)
pacify ★★★★★
( 18.08.15 14:43:39 MSK )
def custom_replace(source, substr, repl, num): """ """ tmp = source.split(substr) if (len(tmp)-1) < num: return source return substr.join(tmp[:num])+repl+substr.join(tmp[num:])
s_str = 'ноладындватриадынчетыреадынадынадын' print(custom_replace(s_str, 'адын', '1', 4)) > ноладындватриадынчетыреадын1адын
vvn_black ★★★★★
( 18.08.15 14:46:59 MSK )
Последнее исправление: vvn_black 18.08.15 14:48:44 MSK (всего исправлений: 2)

Вообще у str.replace есть третий аргумент - count. Будет заменять n первых попавшихся слов, а не все.
Так что можешь отрезать подстроку с начала, котороче как-то так:
s = 'test test test' result s[:5]+s[5:].replace('test','TEST',1) #'test TEST test'
pawnhearts ★★★★★
( 18.08.15 14:48:05 MSK )

Не знаю питон, на перле будет как-то так:
$sm = "test1 test2 test3 test4"; @sm = split ' ', $sm; #преобразуем строку в массив @sm1 = ("$sm[0]", "$sm[2]"); #второй массив, с нужными нам элементами s/e/ж/ for @sm1; #делаем замену $sm[0] = $sm1[0]; #заменяем элементы $sm[2] = $sm1[1]; $sm = join ' ', @sm; #преобразуем массив в строку print $sm
tжst1 test2 tжst3 test4
Очень коряво написано, конечно, но зато работает, а выше по треду никто ничего работающего не предложил.
svobodka_fighter ☆
( 18.08.15 15:02:36 MSK )

Первое, что пришло в голову:
def replaceone(s, oldpart, newpart, num): parts = s.split(oldpart, num) return oldpart.join(parts[:num]) + newpart + parts[num]
replaceone('раз два три тест три четыре тест пять тест шесть сем тест восемь', "тест", "foo", 3) 'раз два три тест три четыре тест пять foo шесть сем тест восемь'
По-хорошему, ещё бы не мешало проверять, не выходит ли num за пределы количества вхождений oldpart, но суть ясна.
Psych218 ★★★★★
( 18.08.15 15:21:37 MSK )
Последнее исправление: Psych218 18.08.15 15:25:47 MSK (всего исправлений: 4)

$ python Python 2.7.10 (default, Jul 5 2015, 14:15:43) [GCC 5.1.1 20150618 (Red Hat 5.1.1-4)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> a="111abc22222abc3333abc44abc55555abc6666abc777" >>> type(a) >>> b = a.split("abc") >>> type(b) >>> b ['111', '22222', '3333', '44', '55555', '6666', '777'] >>> c = b[0] + "abc" + b[1] + "___xxx___" + b[2] + "abc" + b[3] + "abc" + b[4] + "___xxx___" + b[5] + "abc" + b[6] >>> type(c) >>> c '111abc22222___xxx___3333abc44abc55555___xxx___6666abc777'
justAmoment ★★★★★
( 18.08.15 15:27:49 MSK )
Ответ на: комментарий от Psych218 18.08.15 15:21:37 MSK

Ну то есть, как-то так:
def replaceone(s, oldpart, newpart, num): parts = s.split(oldpart, num) if len(parts) < num+1: return s # возвращаем оригинал строки, если заменяется допустим восьмое вхождение, когда их всего семь else: return oldpart.join(parts[:num]) + newpart + parts[num]
Замена строки Python с использованием шаблона 1 мин для чтения


Добавить в избранное
Главное меню » Программирование » Python » Замена строки Python с использованием шаблона

Любые строковые данные можно заменить другой строкой в Python с помощью метода replace(). Но если вы хотите заменить любую часть строки на соответствие определенному шаблону, вам необходимо использовать регулярное выражение. Он используется для поиска определенного шаблона в конкретном строковом значении, и строка будет заменена другой строкой, если будет найдено какое-либо совпадение. Python использует модуль ‘re’ для использования шаблона регулярного выражения в скрипте для поиска, сопоставления или замены. Использование шаблонов регулярных выражений для замены строк немного медленнее, чем обычный метод replace(), но многие сложные поиски и замены можно легко выполнить с помощью шаблона. Вы можете заменить строку различными способами, используя шаблон в Python. В этой статье показаны некоторые распространенные варианты использования шаблона для замены строки.
Список метасимволов:
Прежде чем использовать шаблон для замены строки, вы должны знать, как написать шаблон регулярного выражения. Вы можете использовать любое строковое значение в качестве шаблона для точного совпадения. Но для конкретного поиска вы должны написать шаблон регулярного выражения с использованием метасимвола. Список наиболее часто используемых метасимволов для написания шаблонов приведен ниже со смыслом.
| Характер | Описание |
| . | Используется для соответствия любому одиночному символу, кроме новой строки. |
| ^ | Используется для сопоставления любого символа или строки в начале строки. |
| $ | Используется для сопоставления любого символа или строки в конце строки. |
| + | Используется для сопоставления одного или нескольких экземпляров шаблона. |
| ? | Используется для соответствия нулю или одному вхождению шаблона. |
| () | Используется для группировки паттернов. |
| <> | Используется для соответствия на основе нижнего или верхнего или нижнего и верхнего |
В Python для замены строки используется метод sub() модуля re.
sub(pattern, replace, string, count=0, flags=0)
Здесь шаблон, замена и строка являются обязательными аргументами. Если шаблон совпадает с любой частью строки, он заменит часть значением замены аргумента. Два других аргумента необязательны. Некоторые варианты использования вышеупомянутых метасимволов с методом sub() показаны в следующих примерах замены строк.
Пример-1: заменить строку точным соответствием
Если вам известно точное строковое значение, которое вы хотите искать в основной строке, вы можете использовать значение поисковой строки в качестве шаблона в методе sub(). Создайте файл Python со следующим скриптом. Здесь строковое значение поиска — «дождливый», а заменяющее строковое значение — «солнечный».
#!/usr/bin/env python3 # Импортировать модуль регулярных выражений # Import regex module import re # Определить строку orgStr = "Это дождливый день" # Заменить строку repStr = re.sub("дождливый", "солнечный", orgStr) # Распечатать исходную строку print("Оригинальный текст:", orgStr) # Распечатать замененную строку print("Замененный текст:", repStr)
Пример-2: поиск и замена строки в начале
Создайте файл python со следующим сценарием, чтобы узнать об использовании ‘^’ в шаблоне регулярного выражения. Здесь ‘ ^ [A-Za-z] +’ используется в качестве шаблона поиска. Он будет искать все буквенные символы от A до Z и от a до z в начале текста и заменять его пустым значением. Замененная строка будет напечатана в верхнем регистре для метода upper().
#!/usr/bin/env python3 # Импортировать модуль регулярных выражений import re # Возьмите строку input originalText = input("Введите текст\n") # Замените строку на основе шаблона replacedText = re.sub('^[A-Za-z]+' , '', originalText).upper() # Распечатать замененную строку print("Замененный текст:", replacedText)
Здесь «Привет, добро пожаловать в andreyex» принимается как ввод, а слово «Привет» заменяется на ‘ ’ для шаблона.
Пример-3: поиск и замена строки в конце
Создайте файл python со следующим сценарием, чтобы узнать об использовании символа «$» в шаблоне регулярного выражения. Здесь ‘[ a-z0-9] + $’ используется в качестве шаблона в скрипте. Он будет искать все небольшие алфавитов и цифры в конце текста, и если возвращается true, то соответствующая часть будет заменена на строке «ru».
#!/usr/bin/env python3 # Импортировать модуль регулярных выражений import re # Возьмите строку input originalText = input("Введите URL-адрес\n") # Замените строку на основе шаблона replacedText = re.sub('[a-z0-9]+$' , 'ru', originalText) # Распечатать замененную строку print("Замененный текст:", replacedText)
Здесь «https://www.google.com» используется как вводимый текст, а после замены «https://www.google.ru» печатается как вывод.
Пример-4: поиск и замена определенной части строки
Создайте файл Python со следующим скриптом для поиска и замены части текста в том месте, где совпадает шаблон. Здесь список адресов электронной почты назначается в виде текста переменной с именем emails. ‘@[az]’ — шаблон для поиска. Он будет искать любую подстроку, начинающуюся с маленьких букв, за которыми следует символ «@». Если какая-либо подстрока совпадает, она заменит эту подстроку на @andreyex.
#!/usr/bin/env python3 # Импортировать модуль регулярных выражений import re # Определить строку emails = '\nadmin@google.ru\nmanager@yahoo.com \nandreyex@andreyex.ru' # Заменить конкретную часть строка на основе шаблона replacedText = re.sub('@[a-z]*', '@andreyex', emails) # Вывести исходную строку print("Первоначальный текст:", emails) # Печать замененных строк print("\nЗамененный текст:", replacedText)
Здесь каждая доменная часть адреса электронной почты, назначенная в тексте, заменена на «andreyex».
Вывод:
В этой статье показаны некоторые очень распространенные варианты использования шаблонов регулярных выражений для замены строк. В python существует множество других вариантов для написания различных типов простых и сложных шаблонов для поиска и замены строки текста.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Замена строки Python
В этой статье мы поговорим о том, как заменить подстроку внутри строки в Python, используя метод replace() .
.replace () Метод
В Python строки представлены как неизменяемые объекты str . Класс str имеет множество методов, позволяющих управлять строками.
Метод .replace() имеет следующий синтаксис:
str.replace(old, new[, maxreplace])
- str — строка, с которой вы работаете.
- old — Подстрока, которую нужно заменить.
- new — подстрока, заменяющая старую подстроку.
- maxreplace — необязательный аргумент. Количество совпадений старой подстроки, которую вы хотите заменить. Матчи отсчитываются с начала строки.
Метод возвращает копию строки srt с некоторыми или всеми совпадениями подстроки old замененной на new . Если maxreplace не указан, заменяются все вхождения.
В приведенном ниже примере мы заменяем подстроку far в строке s с miles :
s = 'A long time ago in a galaxy far, far away.'s.replace('far', 'miles')
Результатом является новая строка:
'A long time ago in a galaxy miles, miles away.'
Строковые литералы обычно заключаются в одинарные кавычки, хотя можно использовать и двойные кавычки.
Если maxreplace необязательный аргумент maxreplace , он ограничивает количество заменяемых совпадений. В следующем примере мы заменяем только первое вхождение:
s = 'My ally is the Force, and a powerful ally it is.'s.replace('ally', 'friend', 1)
Строка результата будет выглядеть так:
'My friend is the Force, and a powerful ally it is.'
Чтобы удалить подстроку, используйте вместо нее пустую строку '' . Например, чтобы удалить space из следующей строки, вы должны использовать:
s = 'That’s no moon. It’s a space station.'s.replace('space ', '')
Новая строка будет выглядеть следующим образом:
`That’s no moon. It’s a station.'
Заменить подстроку в списке строк
Чтобы заменить подстроку в списке строк, используйте конструкцию понимания списка, как показано ниже:
s.replace('old', 'new') for s in list
Давайте посмотрим на следующий пример:
names = ['Anna Grace', 'Betty Grace', 'Emma Grace']new_names = [s.replace('Grace', 'Lee') for s in names]print(new_names)
Приведенный выше код создает копию списка, в котором все вхождения подстроки Grace заменены на Lee :
['Anna Lee', 'Betty Lee', 'Emma Lee']
Выводы
Замена подстроки в строке — одна из самых основных операций при написании кода на Python. После прочтения этого руководства вы должны хорошо понимать, как использовать метод replace() .
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Чтение файла без символов новой строки в Python
Существует распространенная задача при работе с файлами в Python, когда требуется считать данные из файла, но без символов новой строки (или перевода строки), которые обычно добавляются в конец каждой строки.
Возьмем в качестве примера текстовый файл с данными, в котором каждая строка представляет собой отдельный элемент. При применении стандартного метода чтения файлов в Python, такого как readlines() , каждая строка возвращается как отдельный элемент списка, но с символом новой строки ( \n ) в конце. Такой символ может мешать дальнейшей обработке данных, особенно если необходимо проводить операции сравнения или поиска подстроки.
# Пример чтения файла с использованием readlines() with open('file.txt', 'r') as f: lines = f.readlines()
В результате выполнения этого кода переменная lines будет содержать список строк из файла, но каждая строка будет оканчиваться символом новой строки.
Чтобы считать данные из файла без символов новой строки, можно использовать метод strip() , который удаляет пробелы и некоторые другие символы (включая символ новой строки) с обоих концов строки.
# Пример чтения файла без символов новой строки with open('file.txt', 'r') as f: lines = [line.strip() for line in f]
В этом примере для каждой строки в файле вызывается метод strip() , который удаляет символ новой строки в конце строки. В результате переменная lines будет содержать список строк из файла, но уже без символов новой строки.
Помимо этого, стоит отметить, что использование выражения for line in f является более эффективным способом чтения файла, поскольку он не загружает весь файл в память сразу, а читает его построчно. Это особенно важно при работе с большими файлами.