2010-03-05 2 views
5

Existe-t-il un moyen d'obtenir regex simple pour satisfaire cette condition ??Comment puis-je inclure un booléen AND dans une regex?

Je cherche un « mot » qui a trois lettres de l'ensemble MBIPI, toute commande, mais doit contenir un I.

ie.

re.match ("[MBDPI] {3}", foo) et "I" dans foo

C'est donc le résultat correct (en python utilisant le module re), mais ce que je peux obtenir cela de une seule regex?

>>> for foo in ("MBI", "MIB", "BIM", "BMI", "IBM", "IMB", "MBD"): 
...  print foo, 
...  print re.match("[MBDPI]{3}", foo) and "I" in foo 
MBI True 
MIB True 
BIM True 
BMI True 
IBM True 
IMB True 
MBD False 

avec regex Je sais que je peux utiliser | comme un opérateur OU booléen, mais y at-il un booléen ET équivalent? Ou peut-être que j'ai besoin d'une recherche en avant ou en arrière?

+0

Vous pouvez également rechercher le caractère 'I' avec str.find(). Source: http://docs.python.org/library/stdtypes.html#str.find – Dor

Répondre

2

Ou est la seule chose que vous pouvez faire:

\b(I[MBDPI]{2}|[MBDPI]I[MBDPI]|[MBDPI]{2}I)\b 

Le caractère \b correspond à une limite de mot zéro largeur. Cela vous assure de faire correspondre quelque chose qui a exactement trois caractères.

Vous courez autrement dans les limites de ce qu'un regular language peut faire.

Une alternative est de faire correspondre:

\b[MBDPI]{3}\b 

capture de ce groupe et ensuite chercher un I.

Edit: pour le plaisir d'avoir une réponse complète, je vais adapter Jens' answer que utilise Testing The Same Part of a String for More Than One Requirement:

\b(?=[MBDPI]{3}\b)\w*I\w* 

les contrôles aux limites de mots pour vous assurer qu'il est seulement trois caractères.

Ceci est un peu plus d'une solution avancée et applicable dans plus de situations mais je préfère généralement ce qui est plus facile à lire (étant la version "ou" imho).

2

Vous pouvez utiliser Lookahead voir si un I est présent:

(?=[MBDPI]{0,2}I)[MBDPI]{3} 
0

avec regex Je sais que je peux utiliser | comme un opérateur OU booléen, mais y at-il un booléen ET équivalent?

A et B = non (non A ou non B) = ([^ A] |! [^ B])

A et B étant des expressions qui peuvent effectivement avoir des membres en commun.

Questions connexes