2014-09-12 4 views
0

Je tente de configurer une expression régulière pour que python corresponde à un ou plusieurs caractères non-blancs, puis à condition qu'il soit précédé d'une virgule, d'un caractère d'espace zéro ou plus fois.Difficulté à faire fonctionner l'expression rationnelle python

Ce que j'ai essayé d'utiliser jusqu'à présent:

([+-])(\S(?:,\s*)*)+ 

J'ai une chaîne comme: "+foo, bar -baz" or "+foo,bar -baz", etc. et que vous souhaitez obtenir deux matchs avec les groupes ("+", "foo,bar") et ("-", "baz")

+0

I vouloir être capable de faire correspondre quelque chose comme: '" + foo, bar -baz "mais aussi" + foo, bar -baz "', etc. vous voulez dire correspondre à la chaîne entière? Pouvez-vous donner un exemple de la chaîne que vous regardez et de ce que vous voulez faire correspondre? – ashwinjv

+0

Bien sûr. Ajouté un edit –

+0

Voulez-vous conserver les espaces dans votre partie? – ashwinjv

Répondre

1

Est-ce que cela fonctionne pour vous?

>>> import re 
>>> p = re.compile('([+-])(\w, ]+)') 
>>> p.findall('+foo, bar -baz') 
[('+', 'foo, bar '), ('-', 'baz')] 
>>> p.findall('+foo,bar -baz') 
[('+', 'foo,bar '), ('-', 'baz')] 

Si vous ne voulez pas conserver les espaces blancs, essayez ceci:

>>> import re 
>>> p = re.compile('([+-])(\w,]+)') 
>>> tempString = '+foo, bar -baz' 
>>> p.findall(tempString.replace(' ', '')) 
[('+', 'foo,bar'), ('-', 'baz')] 

Dans ce cas, le tempString n'est pas modifiée, mais vous supprimez les espaces, puis essayez le match

+0

Le seul problème est qu'il ne va pas être passé strictement \ w caractères de caractères –

+0

Vous pouvez ajouter d'autres caractères en utilisant \ W ou, être spécifique, ou simplement utiliser. *? qui est. * (correspond à tous)? (moins gourmand) – ashwinjv

0

pour correspondre aux nombre de caractères blancs suivi par ,:

[^\s]+, 

T poule dans votre code, vous pouvez écrire son:

>>> import re 
>>> p = re.compile(r'[^\s]+,', re.MULTILINE) 
>>> s = "+foo, bar -baz" 
>>> [x.replace(',', '') for x in p.findall(s)] 
['+foo'] 
0

Je ne suis pas sûr, mais je pense que ce que vous cherchez est le suivant:

p = re.compile(r'^[+-]?[^\s,]+(?:, ?[+-]?[^\s,]+)*$') 
+0

Fermer mais pas tout à fait. Peut-être que maintenant que j'ai édité la question, vous serez en mesure de comprendre ce que j'essaie d'obtenir? –

+0

@ G.Chi: Vos exigences restent toujours peu claires. Qu'est-ce qui devrait revenir: 'foo, bar, baz'? –

+0

re.findall devrait retourner deux matchs de groupes '(" + "," foo, bar ") et (" - "," baz ")' –

1

Voilà ma tentative:

>>> regex = r"([+-])(\S+,\s*\S*|\S+$)" 
>>> re.findall(regex, "+foo, bar -baz") 
[('+', 'foo, bar'), ('-', 'baz')] 

>>> re.findall(regex, "+foo,bar -baz") 
[('+', 'foo,bar'), ('-', 'baz')] 

Pour faire correspondre le -baz à la fin de la chaîne, il était plus facile de diviser la correspondance après le [+-] en deux cas séparés avec |.

Édition: si les virgules ne sont pas toujours présentes, l'expression régulière r"([+-])(\S+(?:,\s*\S*)|\S+$)" pourrait être plus appropriée.

+0

Grande tentative mais il n'y a pas nécessairement une virgule. J'essaie de l'utiliser pour analyser une commande pour ajouter et supprimer des entrées à une liste blanche/noire –

+0

Ah OK. Est-ce que 'r '([+ -]) (\ S + (?:, \ S * \ S *) | \ S + $)" 'est mieux? Sinon, d'autres exemples pourraient aider à se rapprocher d'une solution. –

+0

Cela ne semble correspondre qu'à deux groupes d'entrées mais avec une combinaison de ceci et de la réponse de @Ashwin, j'ai été capable de trouver une solution. Merci! –

Questions connexes