2016-07-05 18 views
0

私は特に、私は次の文字列をフィルタ処理しようとしています、文字列をフィルタリングするために正規表現を使用する方法を学習しようとしています:正規表現文字列マッチングのPythonの問題

一部のテキスト\ nの{{情報\ nは|地域= [[西洋]] \ n | image = image187a.jpg {{!}} \ n | .... \ nの}} \ n iはやりたい何

がと"{{情報" との間に含まれる文字列の部分だけを抽出することであるいくつかのテキスト "}}"また、2つのデリミタタグの間には、他の閉じた中括弧が表示されることがあります。 次のPythonコードを書きましたが、まったく動作しません。

print re.split(r'^\{\{(Information) \}\}$', information.string, flags=re.MULTILINE) 

誰でも手伝ってもらえますか?

+0

https://regex101.com/r/pZ3lG8/1'^.* \ {\ {(。*)}} ' – 1252748

+0

結果= re.search( '\ s * \ {\ s * \ {\ s *(情報\ s * [^}] *)\} \} '、'あなたの入力文字列 ')result.group(0) – Destrif

答えて

0

これは、あなたのテキスト情報内の「タグ」を提供します:

import re 
text = "some text \n {{Information \n | region = [[Western]] \n | .... \n }} \n some text" 
result = re.search(r'{{Information (.*)}}', text, flags=re.DOTALL) 
print(result.groups()[0] 
0

あなたはそれが複数行にまたがる追加の文字を一致させることができますように、区切り文字の間の遅延量指定子を使用する必要があります。複数行モードを追加すると、^$が同じ行の先頭と末尾に一致するようになります。それを取り除く。しかし、便利なモードはドットオールです。

re.search('{{Information .*?}}', information.string, flags=re.DOTALL) 

Regex101 Demo

0

私はあなたがパターンを検索しようとしているとして、このために)(re.splitするre.search()を使用して好みます。もう少し進んでいる

import re 

some_text = 'some text \n {{Information \n | region = [[Western]] \n | .... \n }} \n some text' 

rx_match = re.search(r'{{Information(?P<info>.*?)}}', some_text, re.DOTALL) 

if rx_match is not None: 
    print rx_match.group('info') 

(?P<name>...):あなたはこのような何かを試してみてください。名前付きグループで、名前で情報を選ぶことができます。これを行うには、より簡単な方法は、次のようになります。

正規表現については
rx_match = re.search(r'{{Information(.*?)}}', some_text, re.DOTALL) 

if rx_match is not None: 
    print rx_match.group(1) 

{をエスケープする必要はありません。 [^}]+は負の文字セットです。 (^は、一致するように文字を反転します)。 }ではない1つ以上の文字と一致すると言います。

これで、一致したことを確認する必要があります。その場合は.group()メソッドを使用して、()グループのデータを抽出することができます。

私の意見では、Pythonは正規表現を学ぶのに最適な言語ではないかもしれませんが、それを処理します。他の場所で正規表現を学習してテストし、Pythonで使用するのが最善の方法です。

+0

区切り文字として{{'と'}}含まれている文字列内で必要とされる可能性が低いからです。 '[^}] +'を使用して区切り文字までキャプチャすると、文字列に閉じた中括弧が1つ含まれていれば機能しません。例えば。 – 4castle

+0

@ 4castleの例のように、2つの区切りタグの中に文字列に中括弧が含まれていることに気づきました。 –

+0

これを知って、あなたは正規表現を大きく変更する必要があります。私は2つの変更があります。まず、 're.DOTALL'(' re.S'とも呼ばれる)を追加します。なぜなら、あなたはパターンを分離している改行を持っているからです。また、誰かが怠惰な数量詞を述べました。私はそれがあなたが与えたテキストのための違いを作るとは思わないが、それは助けになるはずです。そこで、re.search(r '{{( [^}] +)}}'、some_text) 'から' re.search(r '{{Information *?)}} '、some_text、re.DOTALL) ' – DKing