1
votes

Python - Trouver les nombres qui n'ont pas de% à la fin en utilisant une expression régulière

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.


1 commentaires

Oh! mon mauvais, les nombres peuvent aussi avoir des périodes en dollars.


3 Réponses :


0
votes

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.


0 commentaires

1
votes

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 +
  • facultatif
  • \ 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.


3 commentaires

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.



1
votes

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


3 commentaires

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 .