2009-05-30 10 views
0

Je ne sais pas si c'est le bon mot pour cela, mais j'essaie de trouver des regex qui peuvent extraire des coefficients et des exposants à partir d'une expression mathématique. L'expression viendra sous la forme 'axB + cxD + exF' où les lettres minuscules sont les coefficients et les majuscules sont les exposants. J'ai une regex qui peut correspondre à chacun d'eux, mais je me demande si je peux utiliser 2 regex, une pour faire correspondre les coefficients et une pour les exposants. Y at-il un moyen de faire correspondre un nombre avec une lettre d'un côté sans correspondre à la lettre? EG, dans '3x3 + 6x2 + 2x1 + 8x0' je dois obtenir ['3', '6', '2', '8'] et ['3', '2', '1', '0']Python regex - correspondance conditionnelle?

+0

Ne pas vous avez besoin (+ -)? –

+0

Je viens d'ajouter les signes aux coefficients ... s'il y a un + alors je l'ignore, et le coefficient juste à côté est positif. S'il y a un - alors je le ramasse en ajoutant juste un - * juste avant le \ d, ça marche très bien. –

Répondre

5

Vous pouvez utiliser positive look-ahead pour faire correspondre quelque chose qui est suivi par autre chose. Pour correspondre aux coefficients, vous pouvez utiliser:

>>> s = '3x3+6x2+2x1+8x0' 
>>> re.findall(r'\d+(?=x)', s) 
['3', '6', '2', '8'] 

De la documentation du module re:

(? = ...) Matches si ... PROCHAINS MATCHS, mais ne consomme une partie de la chaîne. Ceci s'appelle une assertion de lookahead. Par exemple, Isaac (? = Asimov) correspondra à 'Isaac' seulement s'il est suivi par 'Asimov'.

Pour les exposants, vous pouvez utiliser à la place positive look-behind:

>>> s = '3x3+6x2+2x1+8x0' 
>>> re.findall(r'(?<=x)\d+', s) 
['3', '2', '1', '0'] 

Encore une fois, des docs:

(? < = ...) Allumettes si la position actuelle dans la chaîne est précédée d'une correspondance pour ... qui se termine à la position actuelle. C'est ce qu'on appelle un lookbehind positif assertion. (? < = abc) def trouvera un match dans abcdef, puisque le lookbehind sauvegardera 3 caractères et vérifiera si correspond au modèle contenu.

+0

Beau travail. Je ne me souviens pas avoir lu une meilleure explication de look-ahead positif/look-behind. – bernie

1
>>> import re 
>>> equation = '3x3+6x2+2x1+8x0' 
>>> re.findall(r'x([0-9]+)', equation) 
['3', '2', '1', '0'] 
>>> re.findall(r'([0-9]+)x', equation) 
['3', '6', '2', '8'] 
1

Encore une autre façon de le faire, sans regex:

>>> eq = '3x3+6x2+2x1+8x0' 
>>> op = eq.split('+') 
['3x3', '6x2', '2x1', '8x0'] 
>>> [o.split('x')[0] for o in op] 
['3', '6', '2', '8'] 
>>> [o.split('x')[1] for o in op] 
['3', '2', '1', '0'] 
Questions connexes