3

多くの異なるソースからの変数に依存する正規表現を構築しようとしています。

ソース:

dict1 = {"a":"somevalue","b":"somevalue","c":"somevalue"}
source2 = "x"
source3 = "_1"

上記のソースから取得する値に依存する正規表現を構築したいと考えています。結果の正規表現は以下のようになります。

^(a|b|c)x[0-9]{0,10}_1

どこ:

  • (a|b|c)のキーでdict1あり、dict1 つ以上の値を持つことができます。

  • xからの値ですsource2

  • -1から取得する値ですsource3

基本的にソースを連結して正規表現を構築するという解決策に満足していません。他にもっと良い解決策があるかどうか疑問に思っていました。これが私が思いついた解決策です。

group1 = "|".join(dict1.keys())
regex = "^("+group1+")"+source2+"[0-9]{0,10}"+source3

あなたの助けに感謝します。かもre.verbose?しかし、何が最善の方法なのかわかりません。

4

2 に答える 2

0

http://htql.netで htql.RegEx を使用できます。このようなもの:

import htql; 
a=htql.RegEx(); 
a.setNameSet('group1', dict1.keys() )
a.setNameSet('x', [source2])
a.setNameSet('x1', [source3])
results=a.reSearchStr(address, "^&[s:group1]&[s:x][0-9]{0,10}&[s:x1]", case=False); 
于 2013-10-31T18:09:26.283 に答える
0

式が十分に単純である限り、手動で解析することで正規表現エスケープの問題を回避することもできます:

def parse(s):
    assert max(len(k) for k in dict1) == 1 and len(source2) == 1 #keep it simple

    match = (s[0:1] in dict1 and 
        s[1:2] == source2 and
        all(c in string.digits for c in s[2:-2]) and
        len(s[2:-2]) <= 10 and
        s[-2:] == source3)
    return s[0] if match else None
于 2013-05-15T08:36:28.850 に答える