2010-10-23 3 views
0

Possible en double:
Python Regular Expression Matching: ## ##Python Regular Expression Matching ## ##

Je l'ai déjà posé cette question, mais laissez-moi reformule mieux ... Im la recherche d'une ligne de fichier par ligne pour l'occurrence de ## random_string ##. Il fonctionne à l'exception du cas de plusieurs # ...

pattern='##(.*?)##' 
prog=re.compile(pattern) 

string='lala ###hey## there' 
result=prog.search(string) 

print re.sub(result.group(1), 'FOUND', line) 

sortie souhaitée:

"lala #FOUND there" 

Au lieu de cela, j'obtiens ce qui suit parce que son saisissant l'ensemble ### hey ##:

"lala FOUND there" 

Alors comment ignorer un nombre de # au début ou à la fin, et capturer seulement "## string ##".

+1

Modifier votre question existante; ne postez pas une nouvelle copie pour clarifier. duplication possible de [Correspondance d'Expression Régulière Python: ## ##] (http://stackoverflow.com/questions/4001980/python-regular-expression-matching) – geoffspear

+0

Je l'ai fait, mais les gens ont arrêté de répondre à cette question (je pensais que c'était trop vieux) – nubme

+1

Trop vieux? Il est moins d'une heure ... avoir un peu de patience – Wolph

Répondre

1

Votre problème est avec votre correspondance interne. Vous utilisez ., qui correspond à tout caractère qui n'est pas une ligne, et cela signifie qu'il correspond également à #. Donc, quand il obtient ###hey##, il correspond (.*?) à #hey.

La solution facile est d'exclure le caractère # de l'ensemble matchable:

prog = re.compile(r'##([^#]*)##') 

Protip: Utiliser des chaînes brutes (par exemple r'') pour les expressions régulières de sorte que vous ne devez pas devenir fou avec antislash échappe.

Essayer de permettre # à l'intérieur des hachages fera les choses beaucoup plus compliqué.

:

+0

merci, mais il ne fonctionne pas pour la chaîne #### hey ## = (lol – nubme

+0

Déplacé ma réponse à votre question initiale, regardez là –

0
>>> s='lala ###hey## there' 
>>> re.sub("(##[^#]+?)#+","FOUND",s) 
'lala #FOUND there' 

>>> s='lala ###hey## there blah ###### hey there again ##' 
>>> re.sub("(##[^#]+?)#+","FOUND",s) 
'lala #FOUND there blah ####FOUND' 
0
import re 

pattern = "(##([^#]*)##)" 
prog = re.compile(pattern) 

str = "lala ###hey## there" 
result = prog.search(string) 

line = "lala ###hey## there" 

print re.sub(result.group(0), "FOUND", line) 

(EDIT Une version antérieure ne traitait pas de premier plan/arrière ### droite.) L'astuce est-à-dire (non #) au lieu de quoi que ce soit. Cela suppose aussi que

line = "lala #### there" 

résultats dans:

line = "lala FOUND there" 
+0

Vous n'avez pas besoin de mettre parens autour du motif entier, le groupe de correspondance 0 correspond à l'ensemble du texte d'entrée correspondant. –