"a{1;4:6}"
と"a{1;2}b{2:4}"
の文字列が与えられます。;
は2つの異なる数字を表し、:
は一連の数字を表します。ブレース内にはセミコロンとコロンの任意の組み合わせがあります。展開された文字列に文字列を展開します
私はそのようなこれらは上記の2つの例を拡大した結果であることを展開したい:
"a{1;4:6}"
私が対処しなければならなかったことがありません= "a1a4a5a6""a{1;2}b{2:4}" = "a1b2b3b4a2b2b3b4"
私は通常、簡単に解析可能な既製の形式の文字列を与えられています。この場合、私は手動で文字列を解析する必要があります。
私の試みは、コロンまたはセミコロンのいずれかがある場合にヒットするまで手動で何度も手動で文字列を分割し、そこから文字列を作成することです。これはひどく非効率的であり、私はこのアプローチに関する考えを感謝します。
>>> s = "a{1;4:6}"
>>> splitted = s.split("}")
>>> splitted
['a{1;4:6', '']
>>> splitted2 = [s.split("{") for s in splitted]
>>> splitted2
[['a', '1;4:6'], ['']]
>>> splitted3 = [s.split(";") for s in splitted2[0]]
>>> splitted3
[['a'], ['1', '4:6']]
# ... etc, then build up the strings manually once the ranges are figured out.
最初に近いブレースで分割の考え方があること、それが保証されていることである:ここでは、コードがどのように見える(私はちょうど全体でより迅速にポイントを得るために、それの多くを省略)どのような本質的です新しい識別子が関連する範囲とともにそれの後に現れます。どこが間違っていますか?私のアプローチは、最初の例のような単純な文字列に対しては機能しますが、2番目の例ではありません。さらに、それは非効率的である。私はこの問題に関するどんなインプットについても感謝しています。
あなたは 'evalをを使用して、いくつかの策略()'でこれを行うにもすることができますPyParsing – dawg
に見たいと思うかもしれません - あなたはそれがセキュリティ上の配慮を与え使用して慣れている場合。興味があれば、私は例を手にします。あなたの[DSL](https://en.wikipedia.org/wiki/Domain-specific_language)は再帰的なものではないので、正規表現のビットはまた仕事をし、より良い選択肢かもしれません。 – FujiApple
なぜa1とa2の間に 'b2b3b4'があるのですか? –