2013-06-11 2 views
2

Cela devrait être une tâche très facile en utilisant la bibliothèque re. Cependant, je ne peux pas sembler diviser ma chaîne aux délimiteurs ] et [. J'ai déjà lu Splitting a string with multiple delimiters in Python, Python: Split string with multiple delimiters et Python: How to get multiple elements inside square brackets.Séparer à plusieurs délimiteurs sans délimiteur dans la liste

Ma chaîne:

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]" 

Il doit retourner:

['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'] 

Un court exemple d'essayer:

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

J'ai essayé:

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

Mais les aurait soit donner lieu à avoir le délimiteur dans ma liste résultant ou une mauvaise liste tout à fait:

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

Résultat devrait être:

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

Comme condition spéciale tous les sauts de ligne et des espaces blancs avant et après un délimiteur doit être retiré et ne pas être inclus dans la liste non plus.

Répondre

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

Oui, c'est une approche plus simple que les groupes que je n'ai pas capturés. –

+1

Fonctionne très bien. Juste comme un ajout: Comment est-ce que je supprimerais tous les caractères de nouvelle ligne et les espaces blancs à la fin/début d'un élément? – cherrun

+0

Ok. Deviner. Utiliser 'strip()' sur chaque élément de la liste. Merci encore. – cherrun

4

Comme le souligne arshajii, vous n'avez pas besoin de groupes du tout pour cette expression rationnelle particulière.

Si vous aviez besoin de groupes pour exprimer une expression rationnelle plus complexe, vous pouvez utiliser des groupes non capturés pour diviser sans capturer le délimiteur. C'est potentiellement utile pour d'autres situations, mais syntaxiquement désordonné.

(?: ...)

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

Ainsi, le serait par exemple inutilement complexe, mais démonstratif ici être:

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

utiliser ce lieu (sans groupe de capture):

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

ou plus court:

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

Couuld Split ou findall tous, par exemple:

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

utilisant Split et le filtrage de premier plan/espaces de fin:

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

Ou peut-être, d'adapter une approche 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... 
Questions connexes