J'essaie de multiplier par une constante une série de nombres dans une chaîne. J'ai quelque chose comme ça:

my_string = 'AMOUNT="38000" AMOUNT="43000" AMOUNT="56399"'

Je peux facilement faire ça:

my_new_string = re.sub('(?<=AMOUNT\=")\d+', lambda _:str(38000 *2), my_string)

Cela fonctionne, mais ce n'est pas ce dont j'ai besoin.

Ce dont j'ai besoin en tant que sortie comme suit:

my_new_string = 'AMOUNT="76000" AMOUNT="86000" AMOUNT="112798"'

Quelqu'un at-il une idée sur la façon de procéder? Je vous remercie

2
WhelanG 19 nov. 2018 à 17:21

3 réponses

Meilleure réponse

Vous avez juste besoin de faire une petite modification:

re.sub('(?<=AMOUNT\=")\d+', lambda match: str(int(match.group()) * 2), my_string)

L'objet transmis à lambda est l'objet re.Match avec le numéro dont vous avez besoin. Il vous suffit maintenant d'extraire le nombre avec la méthode .group(), de le convertir en int * 2 et de le reconvertir en str.

2
r.ook 19 nov. 2018 à 14:33

Vous pouvez accéder au groupe correspondant dans le lambda, comme

re.sub('(?<=AMOUNT\=")\d+', lambda m:str(int(m.group(0))*2), my_string)
2
functor 19 nov. 2018 à 14:34

Vous pouvez définir une fonction personnalisée et utiliser des chaînes f:

def splitter(x):
    key, val = x.split('=')
    return f'{key}="{int(val[1:-1])*2}"'

mystr = 'AMOUNT="38000" AMOUNT="43000" AMOUNT="56399"'

res = ' '.join(map(splitter, mystr.split()))

'AMOUNT="76000" AMOUNT="86000" AMOUNT="112798"'
0
jpp 19 nov. 2018 à 14:25