2017-11-22 20 views
1

非常に貧しいタイトルは - あなたは、私は次のようで正規表現の一致複数の結果

[<str1>, <str2>,...,<strX>]

リストを返すようにしようとしている

を助けることができると感じた場合、それを更新して自由に感じます文字列:

'%%<str1>%%_Anything_Can_Be_Here_%%<str2>%%'

次のコードは動作しますが、もし」を数行内のの値が2より大きい場合は、最初と最後のセット「%%」の間のすべての値をとります。

>>> import re 
>>> str = '%%nas_ip_address%%' 
>>> re.match('%%(.*)%%', str, re.DOTALL).group(1) 
'nas_ip_address' 


>>> str = '%%nas_ip_address%%:/vx/%%sfs_storage_pool%%' 
>>> re.match('%%(.*)%%', str, re.DOTALL).group(1) 
'nas_ip_address%%:/vx/%%sfs_storage_pool' 
>>> re.match('%%(.*)%%', str, re.DOTALL).groups() 
('nas_ip_address%%:/vx/%%sfs_storage_pool',) 

何とか正規表現を使って文字列から['nas_ip_address', 'sfs_storage_pool']を抽出する方法はありますか?

:私はパフォーマンスが問題ではありませんが、それはあなたが

これを試してみて、同じ文字列に複数の結果を一致させたい場合は

+0

'(%{2、})(。*?)\ 1'?キャプチャグループ2 – ctwheels

答えて

3

あなたはre.findall()を使用することができ、生産

のためではないとして、非常に大きなファイルを解析していますよ
import re 
str = '%%nas_ip_address%%:/vx/%%sfs_storage_pool%%' 
re.findall('%%(.*?)%%', str, re.DOTALL) 
1

*それは、文字列の末尾に近い最も近い%%を、見つけるまで、一度に1つの文字を後戻りそして、最後まですべてを消費することを意味しており、デフォルトで貪欲であるため。それを防ぐために

つのオプション:

  1. 使用怠惰な数量詞*?
  2. の間でoccuring %の危険性は、コントラストを追加していないと否定文字クラス[^%]*を使用する場合でも、より良いです。
関連する問題