2017-02-17 18 views
1

私はRegexに苦労しています。私はwikiを読んで遊んでいましたが、私は正しいマッチをするようです。Pythonは内側の括弧を外して、外側の括弧を残します

string_before = 'President [Trump] first name is [Donald], so his full name is [[Donald] [Trump]]' 
string_after = 'President [Trump] first name is [Donald], so his full name is [Donald Trump]' 

外側の角かっこと内側のテキストを保持しながら、内側の角かっこを削除したいと考えています。

これは正規表現なしでPythonで簡単に解決できますか?

+0

正規表現はネスト処理にはあまり適していません。 – khelwood

+0

これらの括弧で始まるテキストは、どこから入手していますか? – Blender

+0

私は名前付きエンティティタグ付けを行っています。名前には[]が付いています。だから、この場合、タガーは、ドナルドがエンティティであり、トランプがエンティティであり、ドナルドトランプが別のエンティティであるため、3つの異なるエンティティを持つと考えています。これは特別なケースです。「Donald」がテキストの冒頭に、「Trump」が真ん中に、そして新しい組み合わせ「Donald Trump」が最後に記載されている場合があります。 – Isbister

答えて

1

括弧のペア内部隣接する二つの括弧式の具体的なケースでは、これは便利隣接括弧式の任意の数まで拡張しませんが、おそらくそれはあなたのニーズに十分だ

string = re.sub(r'\[\[([^][]+)\] \[([^][]+)\]\]', r'[\1 \2]', string) 

を行うことができます。

1

正規表現を使用すると、このような問題よりも害が大きくなります。文法やルールに基づいた構文解析ロジックを書く必要があります。

たとえば、入れ子構造の解析に適した有限状態変換器(12)を見ることができますが、Regexより理解して使用するほうが複雑です。

0
In [1]: import re 
In [2]: before='blablabla [[Donald] [Trump]] blablabla' 
In [3]: l=before.find('[')+1 
In [4]: r=before.rfind(']') 
In [5]: before[:l] + re.sub(r'[][]','',before[l:r]) + before[r:] 
Out[5]: 'blablabla [Donald Trump] blablabla' 

エラーチェック/処理は省略されています。

+0

クール、ええ、それはその特定の場合を解決します。私は十分に私の例を黙示しませんでした。 「ドナルド」は大統領のファーストネームだと思うが[ドナルド] [トランプ]と呼ばれる人もいる[ドナルド] [トランプ]「私」私の質問が更新されます。 – Isbister

関連する問題