2009-12-17 9 views
2

en Perl Je peux le faire:expressions régulières imbriquées en python

$number = qr/ zero | one | two | three | four | five | six | seven | eight | nine /ix; 
$foo = qr/ quantity: \s* $number /ix; 

Mon expression régulière réelle est beaucoup de lignes et fait à deux chiffres et nombres ordinaux (par exemple, « vingt-deux », « quarante-quatrième "et" douze sont toutes des correspondances complètes ", et je l'utilise à plusieurs endroits.Cette expression compile rapidement, mais elle est certainement non triviale.Je préfère la compiler une seule fois et l'ajouter à d'autres expressions régulières, comme le permet Perl.

Est-il possible d'imbriquer des expressions régulières de cette manière en Python?

+0

Si vous essayez de résoudre la lisibilité de votre regex, consultez aussi re.VERBOSE. http://www.amk.ca/python/howto/regex/regex.html#SECTION000740000000000000000 –

Répondre

6

En python, vous construisez des expressions régulières en passant une chaîne à re.compile. Vous pouvez « nid » expression régulière en passant simplement la manipulation de chaînes régulière:

#!/usr/bin/env python 
import re 
number = 'zero | one | two | three | four | five | six | seven | eight | nine' 
foo = re.compile(' quantity: \s* (%s) '%number,re.VERBOSE|re.IGNORECASE) 
teststr=' quantity: five ' 
print(foo.findall(teststr)) 
# ['five'] 
1

Ceci est probablement pas tout à fait la même chose. Mais vous pouvez le faire:

import re 
number = "(?:zero | one | two | three | four | five | six | seven | eight | nine)" 
foo = "quantity: \s* " + number 
bar = re.compile(foo, re.I | re.X)