2015-05-12 4 views
0

У меня есть много заполнить в пропуски предложения в строках,Python - удалить части строки

например "6d) We took no [pains] to hide it ."

Как можно эффективно анализировать эту строку (в Python), чтобы быть

"We took no to hide it"? 

Я также хотел бы иметь возможность хранить слово в скобках (например, «боли») в списке для последующего использования , Я думаю, что модуль регулярных выражений может быть лучше, чем операции с строкой Python, такие как split().

+0

Вы _can't! _ Если вы не знаете, что именно вы ищете. Если вы дадите некоторые сведения о том, какие формы/формы/позиции существуют. Английский язык не проходит легко из одной формы в другую. Например, вы даже не можете разобрать английское предложение .. не может быть сделано без огромной библиотеки акронимов. – sln

+0

@sln Ничто в вопросе не требует знания грамматики английского языка, а всего лишь способности идентифицировать квадратные скобки. – chepner

+0

@chepner - Просто шучу, правда. Итак, какая часть '6d Мы не взяли [боли], чтобы скрыть это' похоже на предложение для извлечения? – sln

ответ

3

Это даст вам все слова в скобках.

import re 
s="6d) We took no [pains] to hide it ." 
matches = re.findall('\[(.*?)\]', s) 

Затем вы можете запустить это, чтобы удалить все слова в квадратных скобках.

re.sub('\[(.*?)\]', '', s) 
+0

Это прекрасно! +1 для соответствия ему не жадным способом –

+0

Это отлично подходит для получения предложения, удаляющего слово в квадратных скобках, но я также спросил, как удалить число и скобки из начала строки. Для этого ... 're.sub ('\ [(. *?) \]', '', S).split (')') [1] ' – BoltzmannBrain

0

Для примера, вы можете использовать это регулярное выражение:

(.*\))(.+)\[(.+)\](.+) 

вы получите четыре группы, которые можно использовать для создания результирующей строки и сохранить 3. группы для дальнейшего использования:

  1. 6d)
  2. We took no
  3. pains
  4. to hide it .

Здесь я использовал .+, потому что я не знаю, всегда ли ваши строки выглядят как ваш пример. Вы можете изменить .+ на буквенно-цифровой или sth. более конкретно к вашему делу.

import re 

s = '6d) We took no [pains] to hide it .' 
m = re.search(r"(.*\))(.+)\[(.+)\](.+)", s) 

print(m.group(2) + m.group(4)) # "We took no to hide it ." 
print(m.group(3))    # pains 
1
import re 

s = 'this is [test] string' 
m = re.search(r"\[([A-Za-z0-9_]+)\]", s) 
print m.group(1) 

Выход

'test' 
+0

это хороший ответ, предполагающий только одно совпадение за' s' +1 –

0
import re 
m = re.search(".*\) (.*)\[.*\] (.*)","6d) We took no [pains] to hide it .") 
if m: 
    g = m.groups() 
    print g[0] + g[1] 

Выход:

Мы взяли не скрыть.

2

просто для удовольствия (чтобы сделать сбор и замена в одной итерации)

matches = [] 
def subber(m): 
    matches.append(m.groups()[0]) 
    return "" 

new_text = re.sub("\[(.*?)\]",subber,s) 
print new_text 
print matches 
+0

Хороший ответ, но вы могли бы начать лучше, чем * просто для удовольствия *: D –

+1

@ BhargavRao Я согласен, это на самом деле довольно хорошо, а не просто весело. –

+3

все, что я делаю, просто * для удовольствия * ... иногда я даже получаю зарплату за это: P –

Смежные вопросы