2 votes

Python : Convertir des nombres entiers en un nombre (c'est-à-dire 3 --> 1,2,3)

Cela pourrait être plus d'informations que nécessaire pour expliquer ma question, mais j'essaie de combiner 2 scripts (j'ai écrit pour d'autres utilisations) ensemble pour faire ce qui suit.

Chaîne cible (fichier_d'entrée) 4FOO 2BAR

Résultat (fichier de sortie) 1FOO 2FOO 3FOO 4FOO 1BAR 2BAR

Mon premier script trouve le motif et le copie dans le fichier_2.

pattern = "\d[A-Za-z]{3}"
matches = re.findall(pattern, input_file.read())
f1.write('\n'.join(matches))

Mon second script ouvre le fichier de sortie et, à l'aide de re.sub, remplace et modifie la ou les chaînes cibles en utilisant des groupes de capture et des références arrière. Mais je suis coincé ici sur la façon de transformer i.e. 3 en 1 2 3 .

Des idées ?

3voto

jpp Points 83462

En supposant que vos nombres sont compris entre 1 et 9, sans regex, vous pouvez utiliser une compréhension de liste avec f-strings (Python 3.6+) :

L = ['4FOO', '2BAR']
res = [f'{j}{i[1:]}' for i in L for j in range(1, int(i[0])+1)]

['1FOO', '2FOO', '3FOO', '4FOO', '1BAR', '2BAR']

La lecture et l'écriture dans des fichiers CSV sont traitées ailleurs : lire , écrire .

De manière plus générale, pour tenir compte des nombres supérieurs à 9, on peut utiliser itertools.groupby :

from itertools import groupby

L = ['4FOO', '10BAR']

def make_var(x, int_flag):
    return int(''.join(x)) if int_flag else ''.join(x)

vals = ((make_var(b, a) for a, b in groupby(i, str.isdigit)) for i in L)

res = [f'{j}{k}' for num, k in vals for j in range(1, num+1)]

print(res)

['1FOO', '2FOO', '3FOO', '4FOO', '1BAR', '2BAR', '3BAR', '4BAR',
 '5BAR', '6BAR', '7BAR', '8BAR', '9BAR', '10BAR']

3voto

Andrej Kesely Points 20452

Cet exemple simple n'a pas besoin d'utiliser une expression régulière, mais si vous voulez utiliser re Quoi qu'il en soit, voici un exemple (note : vous avez une petite erreur dans votre modèle, qui devrait être A-Z pas A-A ):

text_input = '4FOO 2BAR'

import re

matches = re.findall(r"(\d)([A-Za-z]{3})", text_input)

for (count, what) in matches:
    for i in range(1, int(count)+1):
        print(f'{i}{what}', end=' ')

print()

Imprimés :

1FOO 2FOO 3FOO 4FOO 1BAR 2BAR 

Remarque : si vous souhaitez prendre en charge plusieurs chiffres, vous pouvez utiliser la fonction (\d+) - noter le + signe.

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