2017-10-20 40 views
2

J'ai une liste contenant plusieurs valeurs telles que:suivi sans plus python chiffres d'expression régulière

l = [ 
'210-4521268-18', 
'210.0622277.13', 
'rachid 312-0653348-08', 
'3000401732 00000 064 77063', 
...., 
'312-0653348-08 rachid' 
] 

Je veux chercher uniquement les éléments avec le format « 210.0622277.13 » correspondant à l'expression régulière suivante:

r'\d{3}\D?\d{7}\D?\d{2}' 

jusqu'à présent j'ai écrit l'expression régulière suivante pour aller chercher des valeurs de thèses:

regex = re.compile(r'((\d{3}\D?\d{7}\D?\d{2}$)|(^\d{3}\D?\d{7}\D?\d{2}))') 
# loop through the list to fetch desired part of value 
for line in l: 
    match = regex.search(line) 
    if match: 
     print('line : {} found a match {}'.format(line, line[match.start():match.end()])) 
    else: 
     print('line : {} found no match'.format(line) 

le problème est que la valeur « 3000401732 00000 064 77063 » se correspond

comment puis-je affiner cette expression régulière pour ne pas accepter plus de chiffres après le motif désiré dans le cas où il n'y a plus de chiffres après le modèle de la valeur sera mis au rebut .

les matches que je dois attraper sont:

l = [ 
    '210-4521268-18', 
    '210.0622277.13', 
    '312-0653348-08', 
    '312-0653348-08' 
] 

de sorte que la sortie sera quelque chose comme:

line : 210-4521268-18 found a match 210-4521268-18 
line : 210.0622277.13 found a match 210.0622277 
line : rachid 312-0653348-08 found a match 312-0653348-08 
line : 3000401732 00000 064 77063 found no match 
line : 312-0653348-08 rachid found a match 312-0653348-08 
+0

Si vous souhaitez ancrer le modèle au début de la ligne, vous pouvez le préfixe avec '^', et si vous voulez l'ancrer à la fin de la ligne, vous pouvez le suffixe avec '$' . Donc, pour correspondre à une ligne entière, vous pouvez placer le motif dans '^' et '$'. Est-ce ce que vous cherchez? –

Répondre

2

Cela devrait le faire pour vous:

\d{3}[^\d]\d{7}[^\d]\d{2} 

Démo en direct here

Explication:

\d{3}: comparer 3 chiffres

[^\d]\d{7}: chercher un non-chiffres, alors regardez pour 7 chiffres

: Encore une fois la recherche d'un non-chiffres, alors regardez pour 2 chiffres

+0

c'est un site génial merci beaucoup. –

+1

btw Si vous ne voulez pas que le séparateur soit un espace (ou autre chose) vous pouvez simplement ajouter '\ s' (ou un autre caractère) à l'ensemble comme ceci:' [^ \ d \ s] 'ou si vous Voici une liste de séparateurs autorisés que vous pouvez simplement utiliser comme ceci: '[\ - \.]' –

0

Ce sont correspondances valides - cette chaîne est dans les chaînes renvoyées. Essayez d'ajouter^à l'avant et/ou $ à l'arrière, ou d'une autre manière pour spécifier que les données supplémentaires échoueront.

regex = re.compile(r'^((\d{3}\D?\d{7}\D?\d{2}$)|(^\d{3}\D?\d{7}\D?\d{2}))$') 
1

Vous pouvez essayer ceci:

import re 
l = [ 
'210-4521268-18', 
'210.0622277.13', 
'rachid 312-0653348-08', 
'3000401732 00000 064 77063', 
'312-0653348-08 rachid' 
] 
final_vals = [re.findall('\d+[\W]\d+[\W]\d+', i)[0] for i in l if re.findall('\d+\.|-\d+\.|-\d+', i)] 

Sortie:

['210-4521268-18', '210.0622277.13', '312-0653348-08', '312-0653348-08'] 
+0

s'il vous plaît voir les modifications que j'ai faites pour la question désolé pour le désagrément –

+0

@rachidelkedmiri s'il vous plaît voir ma récente édition. – Ajax1234

0

Vous pouvez ajouter le filtre par point "" comme ceci:

import re 

l = [ 
'210-4521268-18', 
'210.0622277.13', 
'rachid 312-0653348-08', 
'3000401732 00000 064 77063', 
'312-0653348-08 rachid' 
] 

regex = re.compile(r'\b(\w+[.]\w+)') 
# loop through the list to fetch desired part of value 
for line in l: 
    match = regex.search(line) 
    if match: 
     print('line : {} found a match {}'.format(line, line[match.start():match.end()])) 
    else: 
     print('line : {} found no match'.format(line)) 

En conséquence je reçois:

line : 210-4521268-18 found no match 
line : 210.0622277.13 found a match 210.0622277 
line : rachid 312-0653348-08 found no match 
line : 3000401732 00000 064 77063 found no match 
line : 312-0653348-08 rachid found no match 
+0

s'il vous plaît voir les modifications que j'ai faites pour la question désolé pour le désagrément –

0

Essayez de spécifier des points et marquer explicity début et de fin.

r'^\d{3}[^\d]\d{7}[^\d]\d{3}$' 
+0

pour la valeur 'rachid 312-0653348-08' Je dois aller chercher '312-0653348-08', donc votre expression régulière n'atteindra pas le but 100% , merci de toute façon –

+0

Oui, cela correspond seulement '.' Pour correspondre à un non-chiffre, on peut utiliser' [^ \ d] '. –

1

Utilisez l'approche suivante:

l = [ 
'210-4521268-18', 
'210.0622277.13', 
'rachid 312-0653348-08', 
'3000401732 00000 064 77063', 
'312-0653348-08 rachid' 
] 

regex = re.compile(r'\d{3}(?:\.|-)\d{7}(?:\.|-)\d{2}')  
for line in l: 
    match = regex.search(line) 
    if match: 
     print('line : {} found a match {}'.format(line, match.group())) 
    else: 
     print('line : {} found no match'.format(line)) 

Le sortie:

line : 210-4521268-18 found a match 210-4521268-18 
line : 210.0622277.13 found a match 210.0622277.13 
line : rachid 312-0653348-08 found a match 312-0653348-08 
line : 3000401732 00000 064 77063 found no match 
line : 312-0653348-08 rachid found a match 312-0653348-08