入力テキストがあります、
input = 'I like {sushi} and {tempura}.'
リストとそこから置き換えられたsrcを取得したい。
lst = ['sushi', 'tempura']
src = 'I like * and *.'
{}
や*
などの代わりに、入力/出力文字列で任意のトークンを使用できます[]
。
import re
input = 'I like {sushi} and {tempura}.'
regex = re.compile(r'\{([^\}]*)\}')
lst = regex.findall(input) #['sushi','tempura']
mod_str = regex.sub('*',input) #I like * and *.
print (lst)
print (mod_str)
文字列フォーマットで置換することもできます:
mod_str = input.format(**dict((x,'*') for x in lst))
正規表現の内訳 (生の文字列 [ ] を使用したことに注意してくださいr'...'
):
\{
-- リテラル '{' を探します[^\}]
-- リテラル '}' 以外のものに一致*
-- できるだけ多く一致させます。\}
-- リテラル '}' に一致の一致でグループ化を行うために括弧が追加されましたre.findall
。
DSM が指摘しているように、トークン間のテキストを見つけるための別の一般的なイディオムは次のとおりです。
r"\{(.*?)\}"
つまり:
\{
-- リテラル '{' に一致(.*?)
-- 何にでもマッチしますが、貪欲にならないでください -- (マッチの次の部分で re が使用できるものを食べないでください)'\}'
-- リテラル '}' に一致正規表現以外の方法を見つけようとするのをやめられないので、標準の文字列フォーマットを使用するアプローチを次に示します。
>>> import string
>>> s = 'I like {sushi} and {tempura}.'
>>> parsed = string.Formatter().parse(s)
>>> fields = [p[1] for p in parsed if p[1]]
>>> src = s.format(**{f: '*' for f in fields})
>>> fields
['sushi', 'tempura']
>>> src
'I like * and *.'
間のテキストを一致させるわかりやすいメソッド{}
import re
input = 'I like {sushi} and {tempura}'
lst = re.findall('{[(a-zA-Z)]*}',input)
src = re.sub('{[a-zA-Z]*}','*',input)
print lst
['sushi', 'tempura']
print src
I like * and *
その間で何かを一致させたい場合は、mgilsons answer shows またはDSM から{}
使用する必要があります。'{[^}]*}'
{(.*?)}