私のプログラムは、一連のデバイスを記述するための正規表現を取ります。例えば、正規表現を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))
yields
--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']
をこれはおそらく不可能です。通常の正規表現は無限の言葉を持つ言語を受け入れることができるので、REライブラリは通常それらを列挙しようとすることをサポートしません。 – millimoose
投稿した内容は正規表現ではありません。 – Daenyth
基本的に新しいテンプレート言語を作成しています。本当にそれが本当に必要であることを確認してください。 unutbuには適切なアプローチがあります。 – sleeplessnerd