在Python中扩展正则表达式

2 投票
2 回答
5220 浏览
提问于 2025-04-17 10:02

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

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

这个表达式应该展开成 dev01nyc.hukka.com 和 dev02nyc.hukka.com 这样的完整地址。

我该如何使用 Python 中的 re 模块,把用户提供的正则表达式转换成可以使用的完整字符串呢?我现在用的是 Python 2.4。

2 个回答

2

简单来说,就是把第一个大括号提取出来,放到一个组里,然后对这个组进行循环处理:

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']
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

撰写回答