2013-07-16 2 views
3

Учитывая объект юникода со следующим текстом:Как соответствовать несколько строк с регулярным выражением

a 
b 
c 
d 
e 

aaaa 
bbbb 
cccc 
dddd 
eeee 

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

text = ... # the previous text 
exp = u'a\nb\nc\nd\n\e\n{2}(.*\n){5}' 
matches = re.findall(exp, text, re.U) 

Это действительно займет только последнюю строку. Что я могу сделать, чтобы получить последние пять?

ответ

4

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

Если вы сделаете это

exp = ur'a\nb\nc\nd\n\e\n{2}((?:.*\n){5})' 

вы получите пять строк вместе.

Вы не можете добраться до отдельных матчей, если не по буквам из группы вручную:

exp = ur'a\nb\nc\nd\n\e\n{2}(.*\n)(.*\n)(.*\n)(.*\n)(.*\n)' 
+0

Именно то, что я искал. Благодаря!! – davids

2

Почему не просто:

text[text.index('\n\n') + 2:].splitlines() 
# ['aaaa', 'bbbb', 'cccc', 'dddd', 'eeee'] 
+0

Для простоты я только что упомянул текст выше. Тем не менее, фактический текст намного сложнее и может иметь несколько разрывов строк, поэтому мне нужно использовать regex – davids

+0

@ davids У меня есть сомнения, если вы просто ищете пустые строки ... У вас есть лучший пример? –

0

если ваш поиск текста есть какое-то ограничение на количество символов для этой первой части, которую вы не хотите, почему бы не установить поиск только слов с буквой более X:

Это получит каждое слово размером более 2 символов.

Вы можете контролировать, как:

  • {3} Ровно 3 случая;
  • {6,} Не менее 6 экземпляров;
  • {2,5} От 2 до 5 вхождений.
Смежные вопросы