удалить содержимое в скобках из строки - PullRequest
3 голосов
/ 28 июля 2011

У меня есть такая строка:

s = 'word1 word2 (word3 word4) word5 word6 (word7 word8) word9 word10'

как я могу удалить все, что в скобках, чтобы вывести:

'word1 word2 word5 word6 word9 word10'

Я пробовал регулярное выражение, но, похоже, это не работает. Есть предложения?

Лучший Жак

Ответы [ 5 ]

6 голосов
/ 28 июля 2011
import re
s = re.sub(r'\(.*?\)', '', s)

Обратите внимание, что при этом все удаляется только в скобках. Это означает, что вы останетесь с двойным пробелом между "word2 и word5". Выход из моего терминала:

>>> re.sub(r'\(.*?\)', '', s)
'word1 word2  word5 word6  word9 word10'
>>> # -------^ -----------^ (Note double spaces there)

Однако предоставленный вами вывод не таков. Чтобы удалить лишние пробелы, вы можете сделать что-то вроде этого:

>>> re.sub(r'\(.*?\)\ *', '', s)
'word1 word2 word5 word6 word9 word10'
1 голос
/ 28 июля 2011

Мое решение лучше только потому, что оно удаляет лишний пробел; -)

re.sub( "\s\(.*?\)","",s)

РЕДАКТИРОВАТЬ : Вы пишете, он не охватывает все случаи. Конечно, я могу написать более сложное выражение, пытаясь учесть более детально:

re.sub( "\s*\(.*?\)\s*"," ",s)

Теперь результатом является искомая строка или "", если исходная строка ограничена скобками и пробелами.

0 голосов
/ 03 декабря 2011

Если формат ваших строк всегда похож на тот, который вы показываете, вы, вероятно, можете попробовать без регулярных выражений:

>>> s.replace('(','').replace(')','')
'word1 word2 word3 word4 word5 word6 word7 word8 word9 word10'

Это в 4 раза быстрее, чем обычные выражения

>>> t1 = timeit.Timer("s.replace('(','').replace(')','')", "from __main__ import s")
>>> t2 = timeit.Timer("sub(r'\(.*?\)\ *', '', s)", "from __main__ import s; from re import sub")
>>> t1.repeat()
[0.73440917436073505, 0.6970294320000221, 0.69534249907820822]
>>> t2.repeat()
[2.7884134544113408, 2.7414613750137278, 2.7336896241081377]
0 голосов
/ 28 июля 2011

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

Затем для каждого символа, если логическое значение истинно, вы добавляете его в строку удаления, а если оно ложное, вы добавляете его в настоящую строку. Если это открытая скобка, вы добавляете ее в строку удаления и устанавливаете логическое значение true; если это закрывающая скобка, вы устанавливаете строку удаления на "" и устанавливаете логическое значение на false.

Наконец, в конце вы получаете строку удаления, ЕСЛИ открыта скобка, но не закрыта.

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

0 голосов
/ 28 июля 2011

Вы должны заменить все вхождения этого регулярного выражения: \([^\)]*\) пустой строкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...