2012-05-16 4 views
-3

Je dois lire un fichier texte ligne par ligne et extraire une partie de chaque ligne. J'ai un code de travail si la ligne que je lis est dans le format attendu mais ce n'est pas toujours le cas. Il y a des erreurs dans le fichier, c'est-à-dire des informations ou des caractères manquants. Donc, je veux sauter ces lignes défectueuses. Pour cela, je veux utiliser le module regular expression. J'ai défini l'expression régulière dont j'ai besoin. Disons, reg_exp_string va correspondre à la ligne que j'ai lu. Je veux un match complet, je ne veux pas fouiller une partie du texte. S'il s'agit d'une correspondance complète, renvoyez true, sinon renvoyez false. Le penser est, j'ai essayé re.match() et il renvoie un objet. Je ne pouvais pas comprendre. Quelle est la bonne façon de l'utiliser? Il renvoie toujours un objet si une partie de la chaîne correspond à l'expression régulière. Je veux seulement un match complet et obtenir une réponse booléenne. Comment puis-je faire ceci?Module d'expression régulière python

+0

expression régulière Comment-Tutorial/http://docs.python.org/howto/regex.html – Levon

+4

Avez-vous lire la documentation? http://docs.python.org/library/re.html – Riking

+2

Cette question ne montre absolument aucun effort de recherche de la part du PO. http://meta.stackexchange.com/a/128553 –

Répondre

1

Comme mentionné dans le documentation, $ correspond à la fin d'une chaîne. Vous pouvez modifier votre expression régulière pour inclure $ à la fin. Exemple:

match_this = "abc12a" #expression you would like to match 
dont_match_this = "abc12a9" #expression that returns partial matches from re.match 

L'ancienne expression régulière correspondra à la fois match_this et dont_match_this:

old_reg_expr = "[a-z]+\d[a-z]+" 

La nouvelle expression régulière contient $ et retourne seulement un match si la chaîne se termine après le dernier élément adapté à l'expression :

new_reg_expr = "[a-z]+\d[a-z]+$" 

Alternativement, vous pourriez laisser votre ancienne expression régulière intacte et juste ck pour voir si la position de fin du match est égal à la fin de la chaîne:

>>> m = re.match("[a-z]+\d[a-z]+", "abc12a9") 
>>> m.end() == m.endpos 
False 
-1

re.match() doit retourner un objet de correspondance, à moins qu'il n'y a pas de correspondance, auquel cas il retourne None:

http://docs.python.org/library/re.html#re.match

+0

Je serais reconnaissant si une explication pour les downvotes pourrait être fournie. – ubik

-1

Comme indiqué dans http://docs.python.org/library/re.html, match() retourne une MatchObject est une correspondance est trouvée , Aucun autrement.

Alors, dites simplement:

for line in ... : 
    m = your_regexp.match(line) 
    if m: 
     process(line) 
+0

S'il correspond au début, il renvoie un objet mais, Ce dont j'ai besoin, c'est un texte entier. –

+1

@gokhan_ufl: Vous pouvez vérifier si 'match.end() == match.endpos' pour s'assurer que la correspondance est pour toute la chaîne. –

+0

merci. C'est ce que je cherchais.En fait, la réponse est plus courte que les messages "lire ce document". Et ça aide vraiment. C'est l'élément clé, je suppose. Aider les gens. –