2016-11-10 2 views
0

Я очень новичок в регулярных выражениях, и мне нужна помощь в поиске правильного регулярного выражения.Регулярное выражение для соответствия с необязательным следующим текстом

У меня есть текстовый файл вида:

apple 4 
bananas 5 
bananas 5 7 
apple 3 
apple 6 
bananas 3 
bananas 4 5 
apple 3 
bananas 9 

Я ищу регулярное выражение, которое будет соответствовать последнее вхождение "bananas.*" после каждого "apple.*", не имея в виду, что для каждого "apple.*" может быть нет "bananas.*". Регулярное выражение должно соответствовать следующему:

bananas 5 7 
bananas 4 5 
bananas 9 

Заранее спасибо. Я делаю это в python, если это помогает.

+1

Что может помочь показать, что вы пробовали, и сообщить нам, в какой проблеме вы столкнулись. – MooingRawr

+1

Также, что рекурсивное имеет какое-либо отношение к этому? –

+0

Рекурсивная природа приходит в это, похожее на толчок-поп-стек. –

ответ

1

Это на самом деле можно с регулярными выражениями:

^apple.+[\n\r] 
(?:(bananas.*)[\n\r]?)+ 

См a demo on regex101.com, против различных модификаторов и использовать группу 1 каждого матча.


Как полный Python код:

import re 

string = """ 
apple 4 
bananas 5 
bananas 5 7 
apple 3 
apple 6 
bananas 3 
bananas 4 5 
apple 3 
bananas 9 
""" 

rx = re.compile(r""" 
     ^apple.+[\n\r] 
     (?:(bananas.*)[\n\r]?)+ 
     """, re.MULTILINE | re.VERBOSE) 

bananas = [m.group(1) for m in rx.finditer(string)] 
print(bananas) 

См a demo on ideone.com.

0

Нет ничего, что должно быть рекурсивным. Вот образец, который будет работать:

>>> fruit_lit = """apple 4 
bananas 5 
bananas 5 7 
apple 3 
apple 6 
bananas 3 
bananas 4 5 
apple 3 
bananas 9""" 

>>> re.findall(r'apple\s*\d*\s*\n(?:bananas\s*(?:\d+\s*)+\n)*(bananas(?:\s*\d+)+)\s*', fruit_list) 
['bananas 5 7', 'bananas 4 5', 'bananas 9'] 

И как многие из комментариев упомянуть, регулярное выражение может быть не самый лучший способ, чтобы получить то, что вы пытаетесь найти. Итерация по каждой строке и тестирование line.starswith('apple'), а затем line.startswith('banana') для каждой последующей строки может быть лучшим способом.

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