2017-10-09 9 views
1

文字列からトークンを抽出しようとしています。これらのトークンが特定の条件を満たすようにしています。私の特定のケースでは、私はそのような+、=、などの記号を抽出したい - などを引用符で囲まれていない特定の文字と一致するPython正規表現

私は、次の正規表現作成した

:しかし

​​

は、私が適用されたとき:

reg.findall('x += "hello + world"') 

また、引用符の間の+は一致するので、出力:

['+', '=', '+'] 

私の予想される出力は次のとおりです。

['+', '='] 

私の質問は、どうすれば達成できますか?それも可能ですか?私はインターネット上でサーフィンをしていましたが、二重引用符以外のすべてを一致させる方法とそのようなものを見つけました。

+0

シングルパスでは実行できません。引用されたすべてのセグメントを最初に削除し(ネストされた引用符で正しく処理する)必要があります。しかし、これの目的は何ですか?あなたがソースコードや算術文を解析しようとしているようです。 – ekhumoro

+0

実際、私はソースコードに字句解析をしようとしています。そのため、トークン、この場合はタイプシンボルのトークンを定義しておきます。問題は、文字列が定義されている場合、その文字列を処理する方法がわかりません。私の推測はグループで遊んでいますが、正しいパスかどうかはわかりません。 – dpalma

+0

ソースコードはどの言語ですか? Pythonの場合は、[tokenize](https://docs.python.org/2/library/tokenize.html#module-tokenize)を使用してください。 – ekhumoro

答えて

1

まず、文字クラスのすべての特殊文字をエスケープする必要はありません(と]は除きます)。最初の式はsthになります。次のようになります。

[-\[\]{}().,;+*/&|<>=~] 

第2の要件:特定の位置でのマッチング(およびそれらをそのまま残します)。ここでは、(demo on regex101.com)新しいregexモジュールを使用して書くことができ、次のいずれか

"[^"]+"(*SKIP)(*FAIL)|[-\[\]{}().,;+*/&|<>=~] 


歳以上 reモジュールといくつかのプログラミングロジックで括弧を使用します。

import re 

rx = re.compile(r'"[^"]+"|([-\[\]{}().,;+*/&|<>=~])') 

string = 'x += "hello + world"' 

symbols = [match.group(1) for match in rx.finditer(string) if match.group(1)] 
print(symbols) 


両方が得られます

['+', '='] 

あなたはより多くの(*SKIP)(*FAIL)hereを読みたいかもしれません

match_this_but_dont_save_it | (keep_this) 

:の これらのアプローチは、メカニズムに従ってください。

0

は、私はあなたがそれを制限することができます一つのことを行うことができると思い一度

"

の別のoccuranceまでの正規表現をチェックしません、それを来ります"

関連する問題