102 votes

Boucle à travers les correspondances regex python

Je veux transformer une chaîne qui ressemble à ceci :

ABC12DEF3G56HIJ7

en

12 * ABC
3  * DEF
56 * G
7  * HIJ

Je veux construire le bon ensemble de boucles en utilisant la correspondance regex. La clé du problème est que le code doit être complètement général car je ne peux pas supposer la longueur des fragments [A-Z], ni la longueur des fragments [0-9].

152voto

Ray Toal Points 35382

La fonction re.findall de Python devrait fonctionner pour vous.

Démo en direct

import re

s = "ABC12DEF3G56HIJ7"
pattern = re.compile(r'([A-Z]+)([0-9]+)')

for (letters, numbers) in re.findall(pattern, s):
    print(numbers, '*', letters)

96voto

Mithril Points 4940

Il est préférable d'utiliser re.finditer si votre jeu de données est important car cela réduit la consommation de mémoire (findall() renvoie une liste de tous les résultats, finditer() les trouve un par un).

import re

s = "ABC12DEF3G56HIJ7"
pattern = re.compile(r'([A-Z]+)([0-9]+)')

for m in re.finditer(pattern, s):
    print m.group(2), '*', m.group(1)

2voto

Skrap Points 21

En regardant le message de l'OP, le format de la sortie semble être important. Le * est aligné sur la longueur maximale du nombre.

Si c'est le cas, alors cet exemple produit la sortie désirée :

import re

s = "ABC12DEF3G56HIJ7"

pattern = re.compile(r'([A-Z]+)([0-9]+)')

key_length = 0

matches = pattern.findall(s)

for (_, key) in matches:
    key_length = max(key_length, len(key))

for (value, key) in matches:
    print(f"{key:<{key_length}} * {value}")

Cela pourrait être fait de manière plus pythonique, comme avec la compréhension de liste, mais cela a été évité pour la clarté.

Par exemple, la sortie pour s = "ABC1215431DEF3G56HIJ7" serait/devrait être :

1215431 * ABC
3       * DEF
56      * G  
7       * HIJ

1voto

Dabble Points 29

Une version un peu plus simple sur une ligne serait

print(re.sub(r"([A-Z]+)(\d+)", r'\2 * \1\n', s))

0voto

not a robot Points 1674

Une autre option pourrait être d'utiliser re.sub() pour créer les chaînes désirées à partir des groupes capturés :

import re
s = 'ABC12DEF3G56HIJ7'
for x in re.sub(r"([A-Z]+)(\d+)", r'\2 * \1,', s).rstrip(',').split(','):
    print(x)

12 * ABC
3 * DEF
56 * G
7 * HIJ

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X