2015-08-07 5 views
1

У меня есть строка, как этотPython регулярное выражение не возвращает желаемых результатов

{test}{test2}{test3} 

У меня есть функция с регулярным выражением, который должен извлечь все между {}

def cleanup(): 
    mystring = str('{test}{test2}{test3}') 
    rx = re.findall(r'{(.*)}', mystring) 
    for row in rx: 
     return(rx) 

, но при печати эта функция вместо того, чтобы желаемая

test, test2, test3 

он вернется

test}{test2}{test3 

любые идеи?

+0

попробовать это 'г '{(. *?)} ' – luoluo

+2

Совет стиля:' mystring = str ('{test} {test2} {test3}') 'можно более кратко записать как' mystring = '{test} {test2} {test3}' '. Python - динамический язык, поэтому вам не нужно явно указывать переменную, что это строка; это можно сделать само собой. – Kevin

ответ

1

Попробуйте это:

(?<={)([^}]+) 

Regex live here.

Разъяснение:

(?<={)   # starting with '{' 
(    # start of capturing group 
    [^}]+  # any non '}' character 
)    # end of capturing group 

Для вашего входа, он делает 34 шагов.

Надеюсь, это поможет.

+1

'(? <= ...)' не требуется; 'findall' уже исключает' {'из своего вывода из-за группы захвата. – chepner

+0

@chepner. Ты прав. И если это так, он сделает 16 шагов! Быстрее: _https: //regex101.com/r/iZ9oG9/3_ –

3

Используйте .*? для оценки non-greedy, то есть для поиска более коротких совпадений вместо одного длинного.

>>> re.findall(r'{(.*?)}', mystring) 
['test', 'test2', 'test3'] 

BTW, в функции, когда вы делаете

for row in rx: 
    return(rx) 

это будет просто возвращать первый row и игнорировать все остальное! Вместо этого вы можете либо просто вернуть список, без контура, т.е.

return rx 

или вы можете включить функцию в генератор, и yield на несколько результатов

for row in rx: 
    yield rx