2017-08-02 1 views
4

voit attribuer une série de séparateurs:chaîne Split avec plusieurs séparateurs d'un tableau (Python)

columns = ["Name:", "ID:", "Date:", "Building:", "Room:", "Notes:"] 

et une chaîne où certaines colonnes ont été laissées en blanc (et il y a un espace blanc au hasard):

input = "Name:  JohnID:123:45Date: 8/2/17Building:Room:Notes: i love notes" 

Comment puis-je obtenir ceci:

["John", "123:45", "8/2/17", "", "", "i love notes"] 

J'ai essayé tout simplement enlever les sous-chaînes pour voir où je peux aller de là mais je suis s jusqu'à coincé

import re 
input = re.sub(r'|'.join(map(re.escape, columns)), "", input) 

Répondre

5

utiliser la liste pour générer une expression régulière en insérant (.*) entre les deux, puis utilisez strip pour supprimer les espaces:

import re 

columns = ["Name:", "ID:", "Date:", "Building:", "Room:", "Notes:"] 
s = "Name:  JohnID:123:45Date: 8/2/17Building:Room:Notes: i love notes" 

result = [x.strip() for x in re.match("".join(map("{}(.*)".format,columns)),s).groups()] 

print(result) 

Rendement:

['John', '123:45', '8/2/17', '', '', 'i love notes'] 

la partie strip peut être traité par l'expression régulière au détriment d'une expression rationnelle plus complexe, mais d'une expression globale plus simple:

result = re.match("".join(map("{}\s*(.*)\s*".format,columns)),s).groups() 

plus complexe: si les données de champ contient des caractères spéciaux regex, nous devons leur échapper (pas le cas ici):

result = re.match("".join(["{}\s*(.*)\s*".format(re.escape(x)) for x in columns]),s).groups() 
+0

Pour une raison quelconque, je reçois '[ 'John', '123: 45', '2/8/17' , '', '', ''] ' – almino

+0

édité, le mode gourmand a causé des problèmes apparemment. Maintenant corrigé. –

3

Comment l'utilisation re.split?

>>> import re 
>>> columns = ["Name:", "ID:", "Date:", "Building:", "Room:", "Notes:"] 
>>> i = "Name:  JohnID:123:45Date: 8/2/17Building:Room:Notes: i love notes" 
>>> re.split('|'.join(map(re.escape, columns)), i) 
['', '  John', '123:45', ' 8/2/17', '', '', ' i love notes'] 

Pour se débarrasser des espaces, répartis sur les espaces trop:

>>> re.split(r'\s*' + (r'\s*|\s*'.join(map(re.escape, columns))) + r'\s*', i.strip()) 
['', 'John', '123:45', '8/2/17', '', '', ' i love notes'] 
+0

bien, et probablement ce que OP avait à l'esprit. Mais émet un champ vide au début. –

+0

@ Jean-FrançoisFabre Le champ vide au début est parce que vous avez divisé par la valeur '" Nom: "'. Il n'y a rien à gauche de ça, donc ça fait une chaîne vide. Il pourrait y avoir quelque chose à gauche. – Artyer