2016-05-08 8 views
2

"or"演算子を使用すると、Pythonでかなり単純な正規表現を実行していて、奇妙な動作が見られます。それは返すように文字間のPython正規表現の一致

>> str = "blah [in brackets] stuff" 

:私は次のように解析しようとしています

>> ['blah', 'in brackets', 'stuff'] 

が括弧の間のテキストを一致させるために、私はすなわち、後ろの外観を使用し、先読みしています:

>> '(?<=\[).*?(?=\])' 

これを単独で使用すると、実際に括弧内のテキストがキャプチャされます。

>> re.findall('(?<=\[).*?(?=\])' , str) 
>> ['in brackets'] 

しかし、私は空間の間の文字列を解析したり、オペレータを組み合わせると、ブラケット試合は何とか破綻:

私の人生のために
>> [x for x in re.findall('(?<=\[).*?(?=\])|.*?[, ]' , str) if x!=' ' ] 
>> ['blah', '[in ', 'brackets] '] 

私は、この動作を理解することはできません。どんな助けもありがとう。

ありがとうございます!

+1

これは役立つかもしれない - https://regex101.com/r/xM7sK0/1 - 左側にあなたはそれがどのように説明しますデバッガに行くことができますそれはそれがしたことと一致した。 – TessellatingHeckler

+0

ありがとう、それは本当に便利です。 – FrancisWolcott

+0

問題は、正規表現の後半も大括弧に一致することです。最初の試合の後( "blah")、残りのテキストは '[]内にあるものです。 lookbindが開き括弧を見つけられないため、正規表現の前半はここでは一致しません。したがって、正規表現の後半部分が再び一致し、 "[in"というテキストが見つかります。 –

答えて

2

あなたが行うことができます:あなたがこれを行う簡単な方法を探しているなら

>>> s = "blah [in brackets] stuff" 

>>> re.findall(r'\b\w+\s*\w+\b', s) 
['blah', 'in brackets', 'stuff'] 
+0

ありがとう!それは良い解決策です。私はまだ私がなぜ動作しないのか理解することに興味があります。私の頭の中でそれをステップ実行することは理にかなっています:括弧の間にあるものをマッチさせてください。 or演算子の導入がブラケットマッチを解除することは私には意味がありません。何か案は? – FrancisWolcott

0

は、これを使用しています。 注:strをstringに置き換えました。 'str'はPythonの組み込み関数です。

import re 
string = "blah [in brackets] stuff" 
f = re.findall(r'\w+\w', string) 
print(f) 

出力:[「何とか」、「カッコ内の」、「もの」]

0

の答えは、これまであなたがカッコ内2つの以上の単語を持っていることを考慮していません、または1つの単語。次の正規表現は、かっこの先頭と末尾の空白を分割します。文字列に大括弧で囲まれたコンテンツがある場合にも機能します。

s = "blah [in brackets] stuff" 

s = re.split(r'\s*\[|\]\s*', s) # note the 'or' operator is used and literal opening and closing brackets '\[' and '\]' 

print(s) 

出力:['blah', 'in brackets', 'stuff']

とブラケットのいくつかのセット括弧内の単語の異なる量の文字列を使用し、使用した例:

s = "blah [in brackets] stuff [three words here] more stuff [one-word] stuff [a digit 1!] stuff." 

s = re.split(r'\s*\[|\]\s*', s) 

print (s) 

出力:それらのため['blah', 'in brackets', 'stuff', 'three words here', 'more stuff', 'one-word', 'stuff', 'a digit 1!', 'stuff.']

+0

私はあなたのソリューションが本当に好きです。他の区切り文字を括弧で囲んだグループに入れることも簡単です。しかし、括弧の外にある複数の単語を分割しない、つまり、「more」、「stuff」ではなく「more stuff」を返すということだけです。 – FrancisWolcott

2

を興味を持って、これは私が行くことになった成功した正規表現です。そこのどこかに、よりエレガントな解決策は、おそらくですが、これは動作します:

>>> s = "blah 2.0 stuff 1 1 0 [in brackets] more stuff [1]" 

>>> brackets_re = '(?<=\[).*?(?=\])' 
>>> space_re = '[-\.\w]+(?=)' 
>>> my_re = brackets_re + '|' + space_re 

>>> re.findall(my_re, s) 
['blah', '2.0', 'stuff', '1', '1', '0', 'in brackets', 'more', 'stuff', '1'] 
+0

すてきなフランシス –

関連する問題