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?
Répondre
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.
Beau travail. Je ne me souviens pas avoir lu une meilleure explication de look-ahead positif/look-behind. – bernie
>>> 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']
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']
- 1. Supprimer citation dans CORRESPONDANCE REGEX
- 2. version du navigateur Regex correspondance
- 3. Compilation conditionnelle en Python
- 4. correspondance de chaîne en python avec re
- 5. Difficulté avec Simple Regex (préfixe correspondance/suffixe)
- 6. Correspondance des arguments AS3 avec Ruby RegEx
- 7. Correspondance Regex dans ColdFusion OU condition
- 8. Séquence de correspondance RegEx de 5 caractères
- 9. Correspondance efficace de plusieurs expressions rationnelles en Python
- 10. Existe-t-il un module python pour la correspondance regex dans les fichiers zip
- 11. Subtitution Regex en Python
- 12. Python et regex
- 13. Regex en python
- 14. UTF en Python Regex
- 15. Python regex question
- 16. python regex mal à
- 17. Comprendre les critères regex en correspondance de motif
- 18. Comment écrire une regex avec la correspondance de groupe?
- 19. .Net Regex groupe de correspondance et la répétition question
- 20. regex: Correspondance des parties d'une chaîne lorsque la chaîne contient une partie d'un modèle regex
- 21. Comment concilier de façon concise plusieurs instructions regex en Python
- 22. Regex pour l'extraction en Python
- 23. Python Regex Rechercher et remplacer
- 24. Recherche de bash conditionnelle?
- 25. Python Regex combiné avec une substitution de chaîne?
- 26. Motif alphabétique amical Unicode pour python regex?
- 27. python, regex split et caractère spécial
- 28. Python Regex "l'objet n'a aucun attribut"
- 29. Échappement d'une chaîne regex en Python
- 30. Comment accéder aux sous-chaînes capturées après une correspondance regex réussie en Perl?
Ne pas vous avez besoin (+ -)? –
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. –