2017-01-11 2 views
1

これは区切られたテキストですが、正規表現で解析します。Python re.findall()で一致するすべてのグループを取得する

2番目の列と次の秒またはミリ秒です。

>>> import re 
>>> s = '''aaa 
bbb|30s 
ccc|500ms|1s''' 
>>> re.findall(r'(\w+)(?:\|(\d+(?:s|ms)))?(?:\|(\d+(?:s|ms)))?', s) 

出力(期待の答え):

[('aaa', '', ''), ('bbb', '30s', ''), ('ccc', '500ms', '1s')] 

私は*または{X、Y}のような量指定子を使用して、このパターンを短くしたかったです。

だから私はやった:私は失敗した

>>> re.findall(r'(\w+)(?:(?:\|(\d+(?:s|ms)))*)', cmdstr) 

[('aaa', ''), ('bbb', '30s'), ('ccc', '500ms')] # WRONG 

この正規表現パターンはどのようにすることができますか?

答えて

1

あなたは正規表現のグループの可変数を使用できるかどうかについて尋ねているように見えます。クイックGoogle検索に基づいて、答えはノーであるように見えます。正規表現は完全なパターンと一致しますが、同じグループの繰り返しの一致については最後の値だけが記録されます。

単純にs.split('|')を実行してから、代わりに各部分文字列に必要なチェックを行います。

+0

私はそれを得ました。ありがとうございました。 – ijmo

0
import re 

s = '''aaa 
bbb|30s 
ccc|500ms|1s''' 

print(re.findall(r'(\w+)\|?(\w+)?\|?(\w+)?', s)) 

出力:

[('aaa', '', ''), ('bbb', '30s', ''), ('ccc', '500ms', '1s')] 
関連する問題