2016-05-06 6 views
1

のpython要素

myStr = 'START1(stuff); II(morestuff); 8(lessstuff)' 

...のは、私はこのような文字列があるとしましょう...と私は括弧の直前の文字列を抽出し、同様に、括弧内の文字列にしたい繰り返し1,stuff,II,morestuff,8,lessstuff。私はsplit(';')などを使ってこれを達成することができますが、私が1台でそれをやり遂げることができるかどうかは、re.search()で急増しました。私は... ...

test = re.search(r''' 
        START   # This part begins each string 
        (?:   # non-capturing group 
        ([I0-9]+) # capture label before parentheses 
        \(
         ([^)]+?) # any characters between the parentheses 
        \) 
        (?:;)?  # semicolon + space delimiter 
       )* 
        ''', myStr, re.VERBOSE).groups() 

test = re.search(r'START(?:([I0-9]+)\(([^)]+?)\)(?:;)?)*', myStr).groups() 

...以上の読み取り可能な形式でを試してみました...しかし、私は唯一の最後のヒットを取得:('8', 'lessstuff')を。式の同じ部分の複数のヒットを逆参照する方法はありますか?

+0

あなたは 'START1'または単に '1'をしたいですか? – heemayl

+1

これを行う場合は、最初に 're.VERBOSE'フラグについて学ぶことが不可欠です:https://docs.python.org/2/library/re.html#re.VERBOSE ;-) – thebjorn

+0

@heemaylちょうど '1'。私はこの質問の目的のために「START」をオフにしておくことができました。 – reynoldsnlp

答えて

3

あなたのテキストをキャプチャするfindallでこの正規表現を使用することができます。

>>> myStr = 'START1(stuff); II(morestuff); 8(lessstuff)' 
>>> print re.findall(r'(?:START)?(\w+)\(([^)]*)\)', myStr) 
[('1', 'stuff'), ('II', 'morestuff'), ('8', 'lessstuff')] 

RegEx Demo

+1

ありがとう!私は 'findall()'について忘れてしまった! – reynoldsnlp