2013-12-08 4 views
0

Предположим у меня есть строка:Python регулярных выражений: перекрывающиеся паттерны

string = 'AvBvC' 

Я хочу, чтобы соответствовать A, B и C, и это то, что я сделал:

match = re.search('(.*)v(.*)', string) 
print match.groups() 

Проблема заключается в том, результат показывает, что:

('AvB', 'C',) 

вместо того, что я хочу, что я с

('A', 'B', 'C',) 

Как заставить его улавливать все перекрывающиеся узоры.?

Спасибо.

(я знаю, что есть некоторые сообщения по этому же вопросу, но не нашел однозначный ответ на Python)

+0

Пожалуйста Пояснить * точный * выход вы хотите. Не могу догадаться. –

+0

@ Тим Петерс жаль, что я хочу ('A', 'B', 'C',) – user2492270

+0

@PeterDeGlopper Да! просто изменил мой пост (мой исходный код намного длиннее и сложнее, чем это, извините) – user2492270

ответ

2

Ваш вопрос несколько неясных, вы, кажется, имеет более сложную строку, чем вы фактическое шоу.

Использование search() соответствует только первым случаям, вы можете использовать findall() для соответствия всем случаям.

matches = re.findall(r'[^v]+', string) 
['A', 'B', 'C'] 

Другим вариантом было бы split на определенных символов, которые нужно разделить на.

>>> re.split('v', 'AvBvC') 
['A', 'B', 'C'] 
+0

Это работает для моего примера, но моя фактическая строка содержит вещи, которые не являются одиночными символами, такими как A, B, C ... Итак, есть ли способ сделать это, используя «поиск» вместо «findall» ?? – user2492270

+0

'search()' и 'match()' возвращает ровно 1 результат. Итак, нет. Вы должны сделать свой вопрос более ясным ;-) –

+0

@TimPeters Почему отрицательный lookahead не позволяет мне сопоставлять начало строки? – thefourtheye

2

Использование re.split

>>> import re 
>>> re.split('v', 'AvBvC') 
['A', 'B', 'C'] 

И для дальнейшей демонстрации ...

>>> re.split('vw', 'AAvwBBvwCC') 
['AA', 'BB', 'CC'] 
Смежные вопросы