2010-10-22 7 views
2

Je suis nouveau sur python et les expressions régulières. Je recherche un fichier ligne par ligne pour l'occurrence de ## random_string ##, et je veux être capable de capturer la chaîne random_ entre les ## s.Expression régulière Python Correspondance: ####

Ive a essayé les deux modèles, mais pas de chance =/

pattern1=r'[##]()[##]' 
pattern2=r'\#{2}()\#{2}' 

prog=re.compile(pattern1) 
result=prog1.search(line) 
if result: 
    print result.group(0) 

Merci pour toute aide =]

Répondre

6

Essayez d'utiliser:

'##(.*?)##' 

Le problème avec votre regex est que vous essayez de faire correspondre une chaîne vide entre le ## en utilisant un (), vous devez utiliser .*? pour correspondre à quelque chose ou un .+? pour correspondre à n'importe quelle chose non-vide.

Votre première regex [##]()[##] a un bug supplémentaire. Une classe de caractères correspond à un seul caractère, par exemple: [ab] correspond à a ou b mais pas les deux.
Donc, [##] ne correspond pas ##, en fait il est redondant d'avoir des caractères en double dans une classe de caractères, donc [##] est identique à [#] qui est identique à #.

Votre deuxième regex '\#{2}()\#{2}' est presque correct mais pour le match vide. Notez également qu'un # n'est pas un méta caractère (comme ., +, *) d'où vous avez besoin pas l'échapper. Donc, vous pouvez déposer le \ dans \#, mais ayant pas une erreur.

+1

très utile. merci beaucoup pour la mini leçon =] – nubme

+0

'## (. *?) ##' est égal à ## (. *) ## ' –

+0

@ guilin: Non, ce n'est pas le cas. '. *?' est un match non-gourmand, alors que '. *' est un match gourmand. – Amber

0

Votre groupe est vide.

'##(.+?)##' 
0

Ou:

'##([^#]*)##' 

(non testé)

0

Si votre ligne a plusieurs ##()##, quelle serait votre sortie? à savoir, en cas de chevauchement des motifs et que vous souhaitez obtenir ces chevauchements

>>> line="blah ## i want 1 ## blah blah ## i want 2 ## blah" 
>>> line.split("##")[1:-1] 
[' i want 1 ', ' blah blah ', ' i want 2 '] 

>>> line="blah ## i want 1 ## blah" 
>>> line.split("##")[1:-1] 
[' i want 1 '] 

>>> line="blah ## i want 1 ## blah ## " 
>>> line.split("##")[1:-1] 
[' i want 1 ', ' blah '] 
>>> 

Si vous ne voulez pas de chevauchement,

>>> line="blah ## i want 1 ## blah ## i want ## " 
>>> [i for n,i in enumerate(line.split("##")[1:]) if n%2==0] 
[' i want 1 ', ' i want '] 

>>> line="blah ## i want 1 ## blah " 
>>> [i for n,i in enumerate(line.split("##")[1:]) if n%2==0] 
[' i want 1 '] 

>>> line="blah ## i want 1 ## blah ## iwant2 ## junk ## i want 3 ## ..." 
>>> [i for n,i in enumerate(line.split("##")[1:]) if n%2==0] 
[' i want 1 ', ' iwant2 ', ' i want 3 '] 
>>> 
Questions connexes