2016-07-20 3 views
1

Я пытаюсь использовать регулярное выражение для сопоставления последовательностей одного или нескольких экземпляров одних и тех же символов в строке.Python - найти последовательность одинаковых символов

Пример:

string = "55544355" 
# The regex should retrieve sequences "555", "44", "3", "55" 

Могу ли я иметь несколько советов?

+1

Вы можете использовать ['((\ d) \ 2 *)'] (https://regex101.com/r/lI0fF7/1) – anubhava

+0

Нет необходимости в круглых скобках, поэтому '(\ d) \ 1 * 'будет работать также. Не упоминается и о номерах, поэтому, возможно, больше '(.) \ 1 *' – Aaron

ответ

5

Вы можете использовать re.findall() и ((.)\2*) регулярное выражение:

>>> [item[0] for item in re.findall(r"((.)\2*)", string)] 
['555', '44', '3', '55'] 

ключевая часть находится внутри внешней захвата группы - (.)\2*. Здесь мы фиксируем один символ через (.), затем ссылаемся на этот символ по номеру группы: \2. Номер группы равен 2, потому что у нас есть внешняя группа захвата с номером 1. * означает 0 или более раз.

Вы могли бы также решить ее с помощью одного захвата группы и re.finditer():

>>> [item.group(0) for item in re.finditer(r"(.)\1*", string)] 
['555', '44', '3', '55'] 
+0

Вот и все! Большое спасибо –

3

Вы можете легко сделать это без регулярных выражений с использованием itertools.groupby:

>>> from itertools import groupby 
>>> s = '55544355' 
>>> [''.join(g) for _, g in groupby(s)] 
['555', '44', '3', '55'] 
0

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

>>> def f(s): 
     l = [] 
     c = s[0] 
     for x in s: 
      if x in c: 
       c += x 
       continue 
      l.append(c) 
      c = x 
     l.append(c) 
     return l 

>>> f('55544355') 
['555', '44', '3', '55'] 
>>> f('123444555678999001') 
['1', '2', '3', '444', '555', '6', '7', '8', '999', '00', '1'] 
+0

Спасибо за подход, но на этот раз меня заинтересовало использование Regex. –

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