2

プレースホルダーを含む長い文字列があり、データに置き換える必要があります。

strOut = "text text {{ }} text text {{ }}"

このパターンで

pattern = r'\{{(.+?)\}}'

このようなことをするのは簡単です

pattern.sub(self.mymethod, strOut)

置換のために mymethod が呼び出される場所。それは実際にうまく機能します。しかし、これが今の問題です。文字列内のすべてのプレースホルダーをリストの値に置き換える必要があります。たとえば、これも文字列です。

strOut = "text text {{ }} text {{ }} text"

プレースホルダーの数は常に未定です。2つの値としましょうのリストもある場合

myList = [2, 3]

これらの値をプレースホルダーに挿入する方法が必要で、最終的にこれになります

"text text 2 text 3 text"

リスト内の値の数とプレースホルダーの数は常に同じです。いくつになるかは事前にわかりません。

4

5 に答える 5

6
my_csv = '%(first)s,%(last)s'
print my_csv % dict(last='Doe', first='John')  # John,Doe

私がこれを気に入った理由は次のとおりです。

  • 値の順序付けは不要
  • 複数のプレースホルダーを一度に置き換えることができます。

https://stackoverflow.com/a/11023271/2147228からインスピレーションを得た

于 2016-02-03T18:04:00.803 に答える
3

サンプルコード:

>>> strOut = "text text {{ }} text text {{ }}"
>>> pattern = r'\{{(.+?)\}}'
>>> import re
>>> re.findall(pattern, strOut)
[' ', ' ']
>>> items = iter(str(el) for el in [1, 2])
# as pointed out by @eyquem, this can also be written as:
# items = imap(str, [1, 2])

>>> re.sub(pattern, lambda L: next(items), strOut)
'text text 1 text text 2'

プレースホルダーを満たすのに十分なパラメーターがない場合、これは壊れますが、それ以外の場合は残りを無視します。

{}また、2.7+ を使用している場合は、プレース ホルダーとして使用できる場合は笑っています。たとえば、次のように使用でき'text text {} text text {}'.format(*[1,2])ます。

そして「楽しみ」のために

(ab)ラムダを使用すると、次のことができます。

re.sub(pattern, lambda i, j=(str(el) for el in [1, 2]): next(j), strOut)
于 2012-12-14T00:41:17.153 に答える
1

テキストに'{}'(ではなく'{{ }}')が表示されない場合は、次の方法が機能します。と示されているように、それが生成する文字列はstrOutです。strOutmyList'text text 2 text 3 text'

strOut = "text text {{ }} text {{ }} text"
myList = [2, 3]
strOut.replace('{{ }}','{}').format(*myList)
于 2012-12-14T00:54:27.197 に答える
0

あなたはこのようなものを試すことができます(それはのcountパラメータを使用しますre.sub):

In [1]: import re

In [2]: strOut = "text text {{ }} text text {{ }}"

In [3]: pattern = r'\{{(.+?)\}}'

In [4]: reduce(lambda x, y: re.sub(pattern, str(y), x, 1), [2, 3], strOut)
Out[4]: 'text text 2 text text 3'
于 2012-12-14T00:43:07.307 に答える