2012-01-11 95 views
0

我的程序需要一个正则表达式来描述一组设备。例如,在Python中扩展正则表达式

--device=dev{01,02}{nyc}.hukka.com 

应扩大到dev01nyc.hukka.com和dev02nyc.hukka.com

我如何可以使用Python中re模块来扩展用户提供的正则表达式来完成,我可以使用字符串?我正在使用Python 2.4。

+1

这恐怕是不可能的。通常,正则表达式可以接受含有无限量词语的语言,因此RE库通常不会支持尝试枚举它们。 – millimoose 2012-01-11 21:00:53

+0

你发布的内容不是正则表达式。 – Daenyth 2012-01-11 21:10:17

+0

您基本上正在创建一个新的模板语言。确保你真的想要那样。 unutbu确实有适当的方法。 – sleeplessnerd 2012-01-11 21:40:44

回答

6

如果我们re.split上牙套,我们得到:

In [7]: re.split(r'\{(.*?)\}',userstring) 
Out[7]: ['--device=dev', '01,02', '', 'nyc', '.hukka.com'] 

列表中的每个其他项目都来自内部括号,这是我们接下来需要拆分的逗号:

In [8]: [ part.split(',') if i%2 else [part] for i,part in enumerate(re.split(r'\{(.*?)\}',userstring)) ] 
Out[8]: [['--device=dev'], ['01', '02'], [''], ['nyc'], ['.hukka.com']] 

现在我们可以使用itertools.product来列举可能性:

import re 
import itertools 

userstring = '--device=dev{01,02}{nyc}.hukka.com' 

for x in itertools.product(*[ part.split(',') if i%2 else [part] for i,part in 
           enumerate(re.split(r'\{(.*?)\}',userstring)) ]): 
    print(''.join(x)) 

收益率

--device=dev01nyc.hukka.com 
--device=dev02nyc.hukka.com 
1

只需通过提取第一支撑一组和遍历这个组:

import re 

user_arg = "dev{01,02}{nyc}.hukka.com" 

regex = re.compile('dev{(?P<dev_id>[^}]*)}{(nyc)}.hukka.com') 
result = regex.search(user_arg) 

devices = [] 
for dev_id in result.group(1).split(',') : 
    devices.append("dev%s%s.hukka.com" % (dev_id, result.group(2))) 

print devices 

返回:

$ ['dev01nyc.hukka.com', 'dev02nyc.hukka.com']