2013-06-11 2 views
2

Это должна быть очень простая задача с использованием библиотеки re. Однако я не могу разбить свою строку на разделителях ] и [.Разделить на несколько разделителей без разделителя в списке

Я уже читал Splitting a string with multiple delimiters in Python, Python: Split string with multiple delimiters, и Python: How to get multiple elements inside square brackets.

Моя строка:

data = "This is a string spanning over multiple lines. 
     At somepoint there will be square brackets. 

     [like this] 

     And then maybe some more text. 

     [And another text in square brackets]" 

Она должна возвращать:

['This is a string spanning over multiple lines.\nAt somepoint there will be square brackets.','like this', 'And then maybe some more text.', 'And another text in square brackets'] 

короткий пример попробовать:

data2 = 'A new string. [with brackets] another line [and a bracket]' 

Я пробовал:

re.split(r'(\[|\])', data2) 
re.split(r'([|])', data2) 

Но те будут либо привести к тому, разделитель в моем результирующем списке или неверный список в целом:

['A new string. ', '[', 'with brackets', ']', ' another line ', '[', 'and a bracket', ']', ''] 

Результат должен быть:

['A new string.', 'with brackets', 'another line', 'and a bracket'] 

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

ответ

7
>>> re.split(r'\[|\]', data2) 
['A new string. ', 'with brackets', ' another line ', 'and a bracket', ''] 
+1

Да, это более простой подход, чем группы, которые я не рекомендовал. –

+1

Отлично работает. Как дополнение: Как удалить все символы новой строки и пробелы в конце/начале элемента? – cherrun

+0

Хорошо. Догадаться. Использование 'strip()' для каждого элемента в списке. Еще раз спасибо. – cherrun

4

Как указывает аршаджий, для этого конкретного регулярного выражения вам вообще не нужны группы.

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

(?: ...)

A non-capturing version of regular parentheses. Matches whatever regular expression is inside the parentheses, but the substring matched by the group cannot be retrieved after performing a match or referenced later in the pattern. 

http://docs.python.org/2/library/re.html

Так что излишне сложный, но показательный пример здесь будет:

re.split(r'(?:\[|\])', data2) 
2

использовать это вместо того, чтобы (без захвата группы):

re.split(r'\s*\[|]\s*', data) 

или короче:

re.split(r'\s*[][]\s*', data) 
0

Couuld либо раскол или FindAll все, например:

data2 = 'A new string. [with brackets] another line [and a bracket]' 

Использование раскола и фильтрации ведущих/замыкающие пробелы:

import re 
print filter(None, re.split(r'\s*[\[\]]\s*', data2)) 
# ['A new string.', 'with brackets', 'another line', 'and a bracket'] 

Или, возможно, адаптировать FindAll подход :

print re.findall(r'[^\b\[\]]+', data2) 
# ['A new string. ', 'with brackets', ' another line ', 'and a bracket'] # needs a little work on leading/trailing stuff... 
Смежные вопросы