Python повторно разделяет строку перед символом

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

  • разделите строку до 'a'
  • input: "fffagggahhh"
  • вывод: [ "fff", "aggg", "ahhh" ]

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

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

>>> h.split("fffagggahhh")

['fffagggahhh']

>>>

Ответ 1

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

Решение без re

Без re:

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

Ответ 2

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

EDIT:

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

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

KennyTM re кажется более подходящим.

Ответ 3

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

Ответ 4

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",""))
['']

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

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

>>> "fffagggahhh".split('a')
['fff', 'ggg', 'hhh']