2010-04-26 4 views
11

Lorsque vous utilisez des variables (est-ce le bon mot?) Dans des expressions régulières python comme ceci: "blah (? P \ w +)" ("value" serait la variable), comment vous faites que la valeur de la variable soit le texte après "blah" à la fin de la ligne ou à un certain caractère ne prêtant aucune attention au contenu réel de la variable. Par exemple, c'est pseudo-code pour ce que je veux:Expressions régulières Python assignées à des groupes nommés

>>> import re 
>>> p = re.compile("say (?P<value>continue_until_text_after_assignment_is_recognized) endsay") 
>>> m = p.match("say Hello hi yo endsay") 
>>> m.group('value') 
'Hello hi yo' 

Note: Le titre est probablement pas compréhensible. C'est parce que je ne savais pas comment le dire. Désolé si j'ai causé une confusion.

+0

J'ai corrigé un peu votre titre, mais je pense que votre exemple de code montrait clairement ce que vous vouliez (du moins, j'espère l'avoir bien interprété). –

+0

FYI, le truc entre les parenthèses est appelé un "groupe". Dans votre exemple, la valeur est un nom. Donc, vous correspondez à un "groupe nommé". – Stephen

Répondre

12

Pour que vous voudriez une expression régulière de

"say (?P<value>.+) endsay" 

La période correspond à un caractère, et le signe plus indique que cela devrait être répété une ou plusieurs fois ... alors .+ signifie toute séquence de un ou plusieurs caractères. Lorsque vous mettez endsay à la fin, le moteur d'expressions régulières s'assurera que tout ce qu'il trouve se termine effectivement avec cette chaîne.

+0

A travaillé parfaitement! Je vous remercie. – None

10

Vous devez spécifier ce que vous voulez faire correspondre si le texte est, par exemple,

say hello there and endsay but some more endsay 

Si vous voulez faire correspondre l'ensemble hello there and endsay but some more sous-chaîne, @ la réponse de David est correcte. Sinon, pour correspondre à peu hello there and, le modèle doit être:

say (?P<value>.+?) endsay 

avec un point d'interrogation après le signe plus pour le rendre non gourmand (par défaut, il est gourmand, engloutissant tout ce qu'elle peut tout en permettant une correspondance globale; non-gourmand signifie qu'il engloutit comme petit que possible, encore une fois tout en permettant une correspondance globale).

+0

J'ai réfléchi à cela, mais étant donné que le PO parlait d'appariement à la fin de la ligne, il semblait qu'un opérateur avide serait approprié. Encore, +1. –

Questions connexes