2016-04-13 5 views
2

私はPythonには新しく、2つの正確なパターンの間の部分文字列の長いテキスト文字列を解析しようとしています。問題は、終了パターンの最初の出現で停止するようにpythonに指示することにあります。また、サブ文字列のすべてのインスタンスを収集して、後で使用する配列ストレージに配置する必要があります。私は簡単にするために、Nikolaus Gradwohlの(再)モジュール例hereを利用しようとしています。以下は、私がしたことの例です。キャプチャした後、すぐに終点(」、): Pythonで複数の部分文字列を抽出するときに停止位置を宣言する

import re 
string='valuepattern1":"capture",abcdpattern1":"capture2",defg' 
result = re.search('pattern1":"(.*)",', string) 
print result.group(1) 

Output: capture",abcdpattern1":"capture2" 

は、ここで私は(「」パターン1)のポイントを開始セットの間の文字列で見つかったキャプチャのすべてのインスタンス(キャプチャとキャプチャ2)を収集しようとしています。収集された各インスタンスは、キャプチャが設定長さを有していない

print result 
Output: [capture,capture2] 

留意されたい。以下に示すように、アレイに追加する必要があり、文字列全体のすべての変化、しかし、開始および終了パターンは、文字列を介して一貫性を維持します。

アドバンテージありがとうございますこの問題の助けを借りて

+1

この入力はJSONか、より大きなJSON文字列の一部ですか? PythonにはJSONパーサーがあります。たとえそれがJSONでなくても、正規表現解析は非常に壊れやすいかもしれません。 – user2357112

+0

@ user2357112という情報をありがとうございます。文字列は圧縮されたJSONファイルです。私は以前の学生がbashで行った古いスクリプトをPythonのものに変換しようとしていました。スクリプトの大部分には正規表現のコマンドが含まれていますが、これは部分的なものではなく、この場合は実用的ではないので好きでもありません。 –

答えて

2

キャプチャグループの.が閉じ引用符と一致しないようにパターンを変更する必要があります。

最初に、貪欲でないワイルドカード(pattern1":"(.*?)")を使用できます。 *?は、可能な限り大きな数ではなく、可能な限り小さな文字数に一致するように指示します。カッコ内の最初の文字は、文字の残りの部分を除外することを指示するようpattern1":"([^"]*)"が使用するので、[^"]は任意のです^

2番目のオプションは、パターンの捕獲部分から引用符を除外するために、文字クラスを使用することです引用符で囲まれていない文字。

+0

以前にたくさんの正規表現の仕事をしていないのであれば、Pythonの実装は親切ではありません。私は[Pythex](http://pythex.org/)が私がしばらくしていないときに信じられないほど役に立ち、あなたが@Blckknghtで解決策をテストすると、あなたが使用するときに何が変わるかを知ることができました非貪欲な正規表現。 – Sam

+0

この問題に関する情報と支援をお寄せいただきありがとうございます。 Pythexサイトは、将来の実践に非常に役立ちます。 –

関連する問題