Замените строку, расположенную между

Вот моя проблема: в переменной, которая является текстом и содержит запятые, я пытаюсь удалить только запятые, расположенные между двумя строками (фактически [ и ]). Например, используя следующую строку:

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" на каждом шаге.

Или вы можете изучать регулярные выражения! Это будет стоить в конечном итоге.