Замените строку, расположенную между
Вот моя проблема: в переменной, которая является текстом и содержит запятые, я пытаюсь удалить только запятые, расположенные между двумя строками (фактически [
и ]
). Например, используя следующую строку:
input = "The sun shines, that fine [not, for, everyone] and if it rains, it Will Be better."
output = "The sun shines, that fine [not for everyone] and if it rains, it Will Be better."
Я знаю, как использовать .replace
для всей переменной, но я не могу сделать это для ее части.
На этом сайте есть несколько тем, но мне не удалось использовать их для моего собственного вопроса, например:
Ответы
Ответ 1
import re
Variable = "The sun shines, that fine [not, for, everyone] and if it rains, it Will Be better."
Variable1 = re.sub("\[[^]]*\]", lambda x:x.group(0).replace(',',''), Variable)
Сначала вам нужно найти части строки, которые необходимо переписать (вы делаете это с помощью re.sub
). Затем вы переписываете эти части.
Функция var1 = re.sub("re", fun, var)
означает: найти все подстроки в переменной te var
, которые соответствуют re
; обрабатывать их с помощью функции fun
; вернуть результат; результат будет сохранен в переменной var1
.
Регулярное выражение "[[^]] *] означает: найти подстроки, начинающиеся с [
(\[
в re), содержат все, кроме ]
([^]]*
in re) и заканчивать на ]
(\]
в re).
Для каждого найденного появления запустите функцию, которая преобразует это событие в нечто новое.
Функция:
lambda x: group(0).replace(',', '')
Это означает: возьмите найденную строку (group(0)
), замените ','
на ''
(удалите ,
другими словами) и верните результат.
Ответ 2
Вы можете использовать выражение, подобное этому, для их соответствия (если скобки сбалансированы):
,(?=[^][]*\])
Используется что-то вроде:
re.sub(r",(?=[^][]*\])", "", str)
Ответ 3
Ниже приведен метод без регулярных выражений. Вы можете заменить разделители []
словами [/
и /]
, а затем split
на разделителе /
. Затем каждая строка odd
в списке разделов должна обрабатываться для удаления comma
, что может быть выполнено при перестройке строки в понимании списка:
>>> Variable = "The sun shines, that fine [not, for, everyone] and if it rains,
it Will Be better."
>>> chunks = Variable.replace('[','[/').replace(']','/]').split('/')
>>> ''.join(sen.replace(',','') if i%2 else sen for i, sen in enumerate(chunks))
"The sun shines, that fine [not for everyone] and if it rains, it Will Be
better."
Ответ 4
Если вы не хотите изучать регулярные выражения (см. другие ответы на этой странице), вы можете использовать команду раздела.
sentence = "the quick, brown [fox, jumped , over] the lazy dog"
left, bracket, rest = sentence.partition("[")
block, bracket, right = rest.partition("]")
"block" теперь является частью строки между скобками, "слева" - это то, что было слева от открывающей скобки, а "справа" - это то, что было справа от открытой скобки.
Затем вы можете восстановить полное предложение с помощью:
new_sentence = left + "[" + block.replace(",","") + "]" + right
print new_sentence # the quick, brown [fox jumped over] the lazy dog
Если у вас более одного блока, вы можете поместить все это в цикл for, применяя команду раздела "right" на каждом шаге.
Или вы можете изучать регулярные выражения! Это будет стоить в конечном итоге.