2015-12-09 1 views
0

J'essaie d'apprendre Regex et je teste mes modèles dans la coque.Regex correspondant dans IDLE, mais pas dans mon programme pour Python?

re.findall(r'\n\t\t\t\t\t(.*)\n\t\t\t\t\t\n\t\t\t\t\t</a>', str(x), re.MULTILINE) 

Le code est couru contre: http://pastebin.com/yaCXPG3W

imprimer le motif dans la coquille et la sortie est correcte. Cependant, dans mon programme, la liste est vide.

J'ai essayé d'ajouter deux barres obliques sur les onglets et les retours à la ligne .. \\ t mais je n'ai toujours rien.

+0

Vous pouvez modifier l'expression régulière pour éviter des informations en double. 'Re.findall (r \ n \ t \ t \ t \ t \ t (*) \ n \ t \ t \ t \ t \ t \ t \ t \ t \ t \ t \ t \ t ', str (x), re.MULTILINE) 'est la même chose que' re.findall (r' \ n \ t {5} (. *) \ n \ t {5} n \ t {5} ', str (x), re.MULTILINE) ' –

+0

N'apprends pas regex avec HTML! Et n'essayez pas d'analyser HTML avec regex, vous allez tuer beaucoup de minous. Vérifiez http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags –

+0

super, merci pour le conseil. Malheureusement toujours pas de correspondance. –

Répondre

1

Cela semble fonctionner correctement ici. Les \n et \t sont des caractères littéraux dans le pastebin que vous avez fournis, les antislashs doivent donc être échappés.

import re 
x = open('data.html').read() 
m = re.findall(
    r'\\n\\t\\t\\t\\t\\t(.*)\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t</a>', 
    x, 
    re.MULTILINE) 
print(m) 

Et, comme suggéré par Jeff Mandell, vous pouvez raccourcir la regex par:

\\n(\\t){5}(.*)\\n(\\t){5}\\n(\\t){5}</a> 

Donc, cela signifie que si vous avez un fichier contenant des sauts de ligne réels, une expression régulière r'\n' correspondra à ceux-ci.

v = '\n' 
print(v) # prints a blank line 
print(len(v)) # outputs 1 
m = re.match(r'\n', v) 
print(m) # match 
m = re.match(r'\\n', v) 
print(m) # no match 

v = '\\n' # which would appear as \n in your text editor 
print(v) # prints the two characters \ and n 
print(len(v)) # outputs 2 
m = re.match(r'\n', v) 
print(m) # no match 
m = re.match(r'\\n', v) 
print(m) # match 
+0

Ce n'est pas en retournant les onglets et les nouvelles lignes de la liste à part la chaîne que mon shell faisait. Par exemple, j'ai besoin de la gestion de base de données CSE 412 –

+0

Je pense que c'est parce que votre fichier contient en fait la barre oblique '\' suivie de 'n', au lieu de \ n 'newlines. Au moins, le pastebin contient réellement ces caractères et ne contient aucune nouvelle ligne. – Takis

+0

alors que faire si je veux capturer la chaîne littérale dans le modèle ci-dessus pour \ n et \ t? –