2010-11-04 2 views
10

как разбить строку на позиции перед символом?python re-split строка перед символом

  • разделить строку, прежде чем 'а'
  • вход: "fffagggahhh"
  • выход: [ "FFF", "aggg", "аааа"]

очевидный способ Безразлично» т работы:

>>> h=re.compile("(?=a)") 

>>> h.split("fffagggahhh") 

['fffagggahhh'] 

>>> 
+2

Что вы ожидаете, когда вы разбиваете '' aaa ''-' [' ',' a ',' a ',' a '] 'или' [' a ',' a ',' a '] ' ? – kennytm

+0

«aaa» -> «a», «a», «a» или «», «a», «a», «a» – kakarukeys

+0

благодарю вас за все работоспособные ответы! – kakarukeys

ответ

3
>>> r=re.compile("(a?[^a]+)") 
>>> r.findall("fffagggahhh") 
['fff', 'aggg', 'ahhh'] 

EDIT:

Это не будет обрабатывать правильно двойные a с в строке: повторное

>>> r.findall("fffagggaahhh") 
['fff', 'aggg', 'ahhh'] 

KennyTM кажется лучше подходит.

+0

Прохладный раствор !! – pyfunc

+0

Интересно, хочет ли OP сохранить пустую строку из раскола, если она начинается с «a». –

+1

-1 Uncool. Сбой при повторном использовании ... например. «aaa» -> пустой список –

18

Хорошо, это не то решение, которое вы хотите, но я подумал, что это будет полезным дополнением к проблеме.

Решение без повторного

Без Re:

>>> x = "fffagggahhh" 
>>> k = x.split('a') 
>>> j = [k[0]] + ['a'+l for l in k[1:]] 
>>> j 
['fff', 'aggg', 'ahhh'] 
>>> 
+2

+1 KISS способ – knitti

+0

@knitti: Спасибо. Я понимаю, что это не решение на основе re, и я хотел написать его первым, прежде чем я напишу re solution. К тому времени, я закончил писать это, решение на основе re come come. – pyfunc

+2

Да, зачем использовать молоток на одном гвоздь, если у вас есть шутер для ногтей. – knitti

-3

split() принимает аргумент для персонажа разделить на:

>>> "fffagggahhh".split('a') 
['fff', 'ggg', 'hhh'] 
3
>>> rx = re.compile("(?:a|^)[^a]*") 
>>> rx.findall("fffagggahhh") 
['fff', 'aggg', 'ahhh'] 
>>> rx.findall("aaa") 
['a', 'a', 'a'] 
>>> rx.findall("fgh") 
['fgh'] 
>>> rx.findall("") 
[''] 
+1

-1 're.findall (" (?:^| A) [^ a] * "," aaa ")' производит '['', 'a', 'a']' –

+1

@John: См. Обновление. – kennytm

-1
>>> foo = "abbcaaaabbbbcaaab" 
>>> bar = foo.split("c") 
>>> baz = [bar[0]] + ["c"+x for x in bar[1:]] 
>>> baz 
['abb', 'caaaabbbb', 'caaab'] 

Из-за того, как работает нарезка, это будет работать должным образом, даже если в c не существует foo.

2
import re 

def split_before(pattern,text): 
    prev = 0 
    for m in re.finditer(pattern,text): 
     yield text[prev:m.start()] 
     prev = m.start() 
    yield text[prev:] 


if __name__ == '__main__': 
    print list(split_before("a","fffagggahhh")) 

re.split рассматривает образец как разделитель.

>>> print list(split_before("a","afffagggahhhaab")) 
['', 'afff', 'aggg', 'ahhh', 'a', 'ab'] 
>>> print list(split_before("a","ffaabcaaa")) 
['ff', 'a', 'abc', 'a', 'a', 'a'] 
>>> print list(split_before("a","aaaaa")) 
['', 'a', 'a', 'a', 'a', 'a'] 
>>> print list(split_before("a","bbbb")) 
['bbbb'] 
>>> print list(split_before("a","")) 
[''] 
0

Это один работает на повторен a «s

>>> re.findall("a[^a]*|^[^a]*", "aaaaa") 
    ['a', 'a', 'a', 'a', 'a'] 
    >>> re.findall("a[^a]*|[^a]+", "ffaabcaaa") 
    ['ff', 'a', 'abc', 'a', 'a', 'a'] 

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

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