2009-05-20 9 views
2

Je voudrais intercepter chaîne commençant par \*#\*Python expression régulière pour correspondre # suivi 0-7 suivi de ##

suivi d'un nombre entre 0 et 7

et se terminant par: ##

donc quelque chose comme \*#\*0##

mais je ne pouvais pas trouver un regex pour cette

+0

présenter des excuses il y avait une erreur sur le modèle recherché je voudrais intercepter la chaîne commençant par \ * # * suivi par un nombre entre 0 et 7 et se terminant par: ## donc quelque chose comme \ * # \ * 0 ## – DrFalk3n

Répondre

7

$ En supposant que vous souhaitez autoriser seulement un # avant et deux après, je le ferais comme ceci:

r'^(\#{1}([0-7])\#{2})' 

Il est important de noter que Alex's regex correspondra aussi des choses comme

###7###### 
########1### 

qui peut ou non matière.

Ma regex ci-dessus correspond à une chaîne commençant par # [0-7] ## et ignore la fin de la chaîne. Vous pouvez virer un $ sur la fin si vous vouliez qu'il ne corresponde que si c'est la ligne entière.

La première référence arrière vous donne la chaîne # < numéro > ## et la deuxième référence arrière vous donne le numéro à l'intérieur du #.

+0

+1 pour avoir remarqué que – JPCosta

+1

r '^ \ * {1} \ # {1} \ * {1} ([0-7]) \ # {2} $' pour * # * 0 ##? Est ce bien? – DrFalk3n

+0

@ DrFalk3n, oui cela ressemble à ça fonctionne –

1

r'\#[0-7]\#\#'

+0

Je suis curieux d'échapper le '#' s. Lorsque je lis les docs, le '#' est spécial seulement quand re.VERBOSE est spécifié ou dans la construction (? # ...). –

+1

Oui, mais il est recommandé d'éviter tous les caractères alphanumériques qui sont utilisés littéralement dans les modèles RE - protégez contre les "mises à niveau" du langage de pattern RE qui pourraient casser les alphamerics non échappés, et aider les lecteurs en les laissant sachez qu'ils n'ont pas besoin de chercher si un caractère de ponctuation étrange et non échappé a une signification particulière dans un pattern RE ;-). –

1

L'expression régulière devrait être comme^# [0-7] ##

4

Aucun des exemples ci-dessus prennent en compte le * # *

^\*#\*[0-7]##$ 

Pass: * # * 7 ##

Fail: * # * 22324324 ##

Fail: Le caractère^correspond au début de la chaîne, \ * correspond à un seul astérisque, les caractères # n'ont pas besoin d'être échappés dans cet exemple, et finalement le [0-7] correspondre à un singl caractère e entre 0 et 7.

+0

Oups. Je pense que j'ai supposé ces * ont été faussement syntaxe Markdown –

1

Si je comprends bien la question, la plus simple expression régulière dont vous avez besoin est:

rex= re.compile(r'^\*#\*([0-7])##$') 

Les {1} constructions sont redondantes. Après avoir fait rex.match (ou rex.search, mais ce n'est pas nécessaire ici), .group(1) de l'objet de correspondance contient le chiffre donné.

EDIT: Toute la chaîne correspondante est toujours disponible sous la forme match.group(0).Si tout ce que vous avez besoin est la chaîne complète, laissez tomber les parenthèses dans l'expression régulière:

rex= re.compile(r'^\*#\*[0-7]##$') 
+0

vraiment j'ai besoin de toute la chaîne correspondant non seulement le seul chiffre, mais votre suggestion est très utile merci – DrFalk3n

Questions connexes