2010-04-13 7 views
0

J'ai besoin d'extraire des parties d'une chaîne en utilisant regex en Python. Je suis bon avec l'expression rationnelle de base, mais je suis terrible à regarder. J'ai montré deux exemples d'enregistrements ci-dessous. Le dernier grand est toujours un champ de monnaie, par exemple. dans le premier il est 4,76. Dans le second c'est 2,00. La seconde a un numéro de compte qui est le modèle de \ d {6} - \ d {6}. Tout ce qui suit est la monnaie.Problème de motif Regex en python

24.02 24.02VALINTATALO MEGAHERTSI4,76- 
24.02 24.02DOE MRIDANG 157235-1234582,00- 

Pourriez-vous m'aider avec cette regex? Ce que j'ai écrit jusqu'ici est donné ci-dessous mais il considère tout après le «tiret» dans le numéro de compte comme la devise.

.*?(\d\d\.\d\d)(.*?)\s*(?<!\d{6}-\d{6})(\d*,\d\d) 

Merci à l'avance

+0

Donc, vous voulez extraire le dernier numéro (la monnaie), mais il peut être préfixé par un numéro de compte? Est-ce le problème? – compie

+0

Oui, s'il vous plaît. Je suppose que je devrais utiliser une sorte de regard autour. Merci. –

Répondre

1
import re 

def extract_current(s): 
    s = s[s.rfind(' ')+1:-1] 
    s = re.sub('\d{6}-\d{6}', '', s) 
    s = re.sub('[A-Z]+', '', s) 
    return s 

print extract_current('24.02 24.02VALINTATALO MEGAHERTSI4,76-') 
print extract_current('24.02 24.02DOE MRIDANG 157235-1234582,00-') 

Sortie:

4,76 
2,00 
0
(?<=\b\d{6}-\d{6}|[^-\d])\d+?,\d\d 

va correspondre à une "monnaie" qui est soit précédé d'un numéro de compte ou toute autre chose (sauf pour un trait d'union). Est-ce suffisant?

0
(?<=\d{6}-\d{6}|[A-Z ])[0-9,]+(?=-$) 

Cette regex correspond à la première chaîne de chiffres et des virgules qui ont précédé soit un numéro de compte ou d'une lettre ou d'un espace et dispose d'un tableau de bord après qui est le dernier caractère de la ligne/chaîne.

1

Cela semble fonctionner:

.*?(\d\d\.\d\d)(.*?)(?:\d{6}-\d{6})?(\d*,\d\d) 

Explication: (: \ d {6} - \ d {6}) voit le numéro de compte, mais ne se souvient pas. Le point d'interrogation après cela permet l'absence du numéro de compte. La raison pour laquelle nous ne voulons pas nous souvenir du numéro de compte est qu'il rejette l'index auquel nous accédons avec match.group (3). C'est-à-dire, il pourrait s'agir de l'indice 4 si le numéro de compte était présent.

+0

+1. Aussi, je sais que l'OP a utilisé l'initiale '. *?', Mais je suis sûr qu'il peut être abandonné si on utilise la méthode '.search' au lieu de' .match'. – tzot