2016-04-29 2 views
2

Я пытаюсь найти (и считать) последовательность соединенных или разделенных символов, например: «abc» («b» должен следовать «a» и «c», b ". Нечувствительность к регистру)Python regex - найти и подсчитать последовательность символов

"A big duck!" -> the pattern should be matched once. 
"A big duckabc!" -> The pattern should be matched twice. 

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

+0

Я думаю, что вы ищете 'a. * B. * C' и да, внутри lookahead:' (? = A. * B. * C) ' –

+0

думает, что это три для второго случая? 'Большой duc',' Большой duckabc', 'abc' –

+0

' a. *? B. *? C' ищут ближайшие 'b'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' (? = (a. * b. * c)) 'будет возвращать' Большая duckabc' и 'abc' для второй строки. Кроме того, шаблон сопоставления точек позволяет 'a' после' b' (до 'c'). –

ответ

4

Вы можете использовать регулярное выражение a.*?b.*?c найти a, а затем b, а затем c, с некоторыми дополнительными символами между ними. *? делает эти промежуточные строки неживыми (иначе вы бы получили только одно совпадение для второго примера).

>>> p = "a.*?b.*?c" 
>>> re.findall(p, "A big duck!", flags=re.I) # re.I == ignore case 
['A big duc'] 
>>> re.findall(p, "A big duckabc!", flags=re.I) 
['A big duc', 'abc'] 

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

>>> chars = "abc" 
>>> p = ".*?".join(chars) 

Чтобы получить количество совпадений, просто получить len из списка результатов.


Примечание: Это делает не ручки перекрывающихся спички, т.е. re.findall(p, "aaabbbccc", flags=re.I) будет возвращать только один матч. Просьба уточнить, является ли это проблемой.

+0

Это не сработает, если вход «Aabbcc большой duckabc!» «.. Мне нужно пойти с регулярным выражением Wiktor .. –

+0

@AvinashRaj Я думаю, это зависит от того, как должны выполняться совпадающие совпадения. В этой связи вопрос не совсем ясен. Я добавил уведомление о своем ответе. –

+0

Большое спасибо. На самом деле мне не нужно обрабатывать совпадающие совпадения. –

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