2016-05-06 2 views
1

Скажем, у меня есть строка, как это ...питон повторно обратная ссылка повторяется элементы

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

... и я хочу, чтобы немедленно извлечь строку перед скобками, а также строки в скобках: 1, stuff, II, morestuff, 8, lessstuff. Я могу достичь этого, используя split(';') и т. Д., Но я хочу посмотреть, смогу ли я сделать это одним махом с re.search(). Я попытался ...

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

... или в более удобном для восприятия формате ...

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() 

... но я только получить последний удар: ('8', 'lessstuff'). Есть ли способ для обратной ссылки нескольких ударов одной и той же части выражения?

+0

Вы хотите 'START1' или просто' 1'? – heemayl

+1

Если вы собираетесь это сделать, вам необходимо сначала узнать о флаге 're.VERBOSE': https://docs.python.org/2/library/re.html#re.VERBOSE ;-) – thebjorn

+0

@heemayl Просто '1'. Я мог бы оставить «СТАРТ» для целей этого вопроса. – 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

Смежные вопросы