2017-02-17 8 views
1

私はPythonを初めて使い、まだ正規表現について学んでいるので、この質問は正規表現の専門家にとっては些細なことかもしれません。 私の質問はthis question about finding a string between two stringsの一般化です。私は疑問に思う:このパターン(initial_substring + substring_to_find + end_substring)を長い文字列で何度も繰り返すとどうなるでしょうか?Python:2つの文字列の間の文字列を繰り返し検索します。

test='someth1 var="this" someth2 var="that" ' 
result= re.search('var=(.*) ', test) 
print result.group(1) 
>>> "this" someth2 var="that" 

代わりに、例えば は、私が["this","that"]のようなリストを取得したいのですが。 どうすればいいですか?

+0

それは 'regex'ことがありますか? –

+0

それはアイデアでしたが、それを行うより賢明な方法があれば、してください! – Nonancourt

+0

@Nonancourt - ほとんどの場合、正規表現はそれを行うための最も速く、最も読みやすい方法にはなりません。確かに、手作業で文字列を検索することはできますが、その道を進むには本当に良い理由が必要です。 – zwer

答えて

2

使用re.findall()

result = re.findall(r'var="(.*?)"', test) 
print(result) # ['this', 'that'] 
1

あなたの現在のregexの問題は、キャプチャグループ(.*)は非常に貪欲な声明であるということです。文字列のvar=の最初のインスタンスの後、そのキャプチャグループはすべての後になります。

あなたの代わりにvar="(\w+)"に式の一般化を減少させた場合、あなたは同じ問題を持っていないだろうが、そのためにpythonのその行を変更:

result = re.findall(r'var="([\w\s]+)"', test) 
+0

入力文字列に 'var =" foo bar "(またはその問題の単語以外の文字)が含まれていて、引用符の間のすべてを抽出したいという前提で失敗します。 – zwer

+0

@zwerはい、そうかもしれませんが、引用符の中の単語が 'var ='接頭辞(OP指定なしで作られるのが最善ではないと仮定して)として変数として使用されている場合、 –

+0

'\ w'も数字をキャプチャし、' 3this'も有効な変数名ではありません。 – zwer

関連する問題