J'ai la liste suivante en Python:
my_list = ['Prix TTC euros: 10,10', 'Prix HT euros 8,42', 'TVA (20,00%) euros: 1,68']
Je veux tout avoir les nombres comme 10,10, 8,42 et 1,68 sans le nombre en pourcentage (20,00%)
Mon code:
10,10 8,42 20.00
Il imprime:
my_list = ['Prix TTC euros : 10,10', 'Prix HT euros 8,42', 'TVA (20.00%) euros : 1,68']
for item in my_list:
try:
found = re.search('([+-]?([0-9]*[,.])?[0-9]+)', item).group()
except AttributeError:
found = None # apply your error handling
print(found)
J'essayais d'échapper au dernier numéro trouvé 20,00 et d'obtenir 1, 68. Y a-t-il un moyen d'échapper au nombre se terminant par% ou quelque chose d'une autre solution.
3 Réponses :
Plutôt qu'une anticipation négative, essayez d'en utiliser une positive en terminant votre expression par (? = [^ 0-9,.%] | $) - "suivi par quelque chose qui n'est pas % , d'autres parties d'un nombre, ou par rien du tout ».
Sinon, extrayez simplement toutes les séquences de [0-9.,%] + et utilisez Python pour éliminer les mauvaises correspondances.
Il existe un moyen d'éviter de faire correspondre les valeurs de pourcentage avec une limite de mot suivie d'une anticipation négative qui rejettera les correspondances suivies d'un symbole % :
import re
my_list = ['Prix TTC euros : 10,10', 'Prix HT euros 8,42', 'TVA (20.00%) euros : 1,68']
for item in my_list:
found = re.search(r'[-+]?\b(?!\d+(?:[,.]\d+)?%)\d+(?:[.,]\d+)?', item)
if found:
print(found.group())
Voir la Démo Python en ligne , résultat: ['10, 10 ',' 8,42 ', '1,68'] .
Voir aussi une démo regex :
[- +]? - un - ou + \ b - une limite de mot (?! \ d + (?: [.] \ d +)?%) - une anticipation négative qui échoue la correspondance s'il y a plus de 1 chiffres, une séquence facultative de . ou , puis 1+ chiffres immédiatement à droite de l'emplacement actuel \ d + - 1+ chiffres (?: [.,] \ d +)? - une séquence facultative de . ou , puis 1+ chiffres.
Cela fonctionne bien mais n'échoue que lorsqu'un espace blanc se trouve juste avant le ',' comme Prix HT ei: 8, 42
@SiddiquiNoor Quel est le résultat attendu pour le Prix HT ei: 8, 42 ? Si vous voulez correspondre à 8, 42 , utilisez cette expression régulière .
Stribizew oui parce que j'ai parfois trouvé de la place dans ma chaîne pour que votre suggestion fonctionne comme prévu.
Commençons par votre expression régulière:
10,10 8,42 1,68
cela fonctionne comme vous l'avez mentionné. Nous devons ajouter le % à la fin de cette expression régulière comme une anticipation négative
found = re.search(
r'([+-]?(?:[0-9]*[,.])?[0-9]+)(?!(?:%|(?:[+-]?(?:[0-9]*[,.])?[0-9]+)))',
item
).group
qui imprime:
10,10 8,42 20.0 # <---- note the last digit is missing here
Il n'obtient pas le résultat attendu.
@SiddiquiNoor Je ne pense pas, à moins que nous ne nous comprenions mal. Découvrez-le sur le site regex101: regex101.com/r/0ufq0q/1
Oui, tu as raison. Cela fonctionne aussi. Pour le deuxième prix, je n'ai eu que 8. Plus tard, j'ai découvert qu'il y avait une place dans mon deuxième prix 8, 42 .
Oh! mon mauvais, les nombres peuvent aussi avoir des périodes en dollars.