我的程序需要一個正則表達式來描述一組設備。例如,在Python中擴展正則表達式
--device=dev{01,02}{nyc}.hukka.com
應擴大到dev01nyc.hukka.com和dev02nyc.hukka.com
我如何可以使用Python中re
模塊來擴展用戶提供的正則表達式來完成,我可以使用字符串?我正在使用Python 2.4。
我的程序需要一個正則表達式來描述一組設備。例如,在Python中擴展正則表達式
--device=dev{01,02}{nyc}.hukka.com
應擴大到dev01nyc.hukka.com和dev02nyc.hukka.com
我如何可以使用Python中re
模塊來擴展用戶提供的正則表達式來完成,我可以使用字符串?我正在使用Python 2.4。
如果我們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
只需通過提取第一支撐一組和遍歷這個組:
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']
這恐怕是不可能的。通常,正則表達式可以接受含有無限量詞語的語言,因此RE庫通常不會支持嘗試枚舉它們。 – millimoose 2012-01-11 21:00:53
你發佈的內容不是正則表達式。 – Daenyth 2012-01-11 21:10:17
您基本上正在創建一個新的模板語言。確保你真的想要那樣。 unutbu確實有適當的方法。 – sleeplessnerd 2012-01-11 21:40:44