2013-06-19 9 views
1

Я splitting a string without removing delimiters, помещая полное круглое выражение в круглые скобки. Целью является сопоставление предложений, заканчивающихся одним или несколькими символами [!?] '.Разделение строки без удаления разделителей, но подавление пустых групп захвата

Все замечательно, за исключением того, что я получаю нежелательных пустых групп захвата - как подавить их, по крайней мере, хакерский и наиболее регулярный способ?

>>> re.compile(r'([^!?]*[!?]+)').split('Great customer service! Very happy! Will go again') 
['', 'Great customer service!', '', ' Very happy!', ' Will go again'] 

>>> re.compile(r'([^!?]{2,}[!?]+)').split('Great customer service! Very happy! Will go again') 
['', 'Great customer service!', '', ' Very happy!', ' Will go again'] 

(Это все глубоко вложены в более сложные регулярные выражения и подфункция, так что на самом деле не хочет хаки. Я хочу, чтобы решение было regexish, чтобы я мог сложить его в более сложное регулярное выражение)

+1

В таких случаях обычно лучше использовать совпадение вместо разделения (или что бы то ни было, подобные функции вызываются в python). – Qtax

+0

@Qtax: нет, мне нужно также сохранить несогласованные выражения. Я искренне хочу сделать раскол, а не просто матч. – smci

+3

Эти пустые строки не из групп захвата, они являются результатом разделения. Отбрасывая естественные результаты разделения, сохраняя содержимое групп захвата, вы получаете почти тот же результат, который вы получили бы от 'findall()'. Вы действительно хотите использовать 'split()'? –

ответ

2

Это регулярное выражение, кажется, работает:

r'(?<=[!?])\s+(?=\S)' 

То, что я пытаюсь сделать, это соответствует пробел между предложениями, но только если предыдущее предложение заканчивается ? или !. Это немного менее хаки, чем ваш подход, но, вероятно, это лучше всего вы собираетесь делать. Манипулирование естественным языком с помощью регулярных выражений по определению является хакерским. : D

+0

Аккуратно, но это соответствует предложению ** после ** предложения, заканчивающегося одним или несколькими символами [!?] '. Я попытаюсь позже опубликовать текст примера. – smci

+0

Любое предложение, которое не заканчивается символом '?' Или '!', Будет рассматриваться как часть следующего предложения. Это то, о чем вы говорите? Ваше регулярное выражение делает то же самое. Я просто пытаюсь исправить ваше регулярное выражение; у вашего решения есть и другие проблемы. –