次のような要素のリストがあります。
['1:{test}', '2:{test}', '4:{1989}', '9:{test}', '']
私の質問は:
このリストの要素から特定の文字を削除するにはどうすればよいですか?
その結果、私は持っていたい:
['test', 'test', '1989', 'test', '']
提案、解決策はありますか?
前もって感謝します。
>>> re.findall(r'\{(.*)\}', '1:{test}')
['test']
それを使ってループを作るだけです:
[(re.findall(r'\{(.*)\}', i) or [''])[0] for i in your_list]
または多分:
[''.join(re.findall(r'\{(.*)\}', i)) for i in your_list]
次のように、正規表現を使用できます。
import re
s = re.compile("\d+:{(.*)}")
data = ['1:{test}', '2:{test}', '4:{1989}', '9:{test}', '']
result = [s.match(d).group(1) if s.match(d) else d for d in data]
結果は
['test', 'test', '1989', 'test', '']
t = ['1:{test}', '2:{test}', '4:{1989}', '9:{test}', '']
map(lambda string: re.search(r'(?<=\{).+(?=\})', string).group(0), t)
確かに、これは最も適切にフォーマットされた、または最も読みやすい回答ではありません。これは、括弧内にあるものを検索してリストの各要素に返す無名関数をマップし、リスト全体を返します。
(?<=...)
「これが最初にあるもののみに一致するが、結果には含めない」ことを意味します
(?=...)
「これが最後にあるもののみに一致するが、結果には含めない」ことを意味します
.+
「あらゆる種類の少なくとも1つの文字」を意味します
Python のstrip()
関数はまさにそれを行います -- 文字列の末尾から特定の文字を削除します -- しかし、あなたが望むことを行うより良い方法がおそらくあります。
パターンが何であるか、または中括弧がない場合に何が必要かを正確に述べていませんが、これはあなたの例で機能します:
stripped = []
for x in my_data:
m = re.search("{.*}", x)
stripped.append(m.group if m else x)