как разбить строку на позиции перед символом?
- разделите строку до 'a'
- input: "fffagggahhh"
- вывод: [ "fff", "aggg", "ahhh" ]
очевидный способ не работает:
>>> h=re.compile("(?=a)")
>>> h.split("fffagggahhh")
['fffagggahhh']
>>>
как разбить строку на позиции перед символом?
очевидный способ не работает:
>>> h=re.compile("(?=a)")
>>> h.split("fffagggahhh")
['fffagggahhh']
>>>
Хорошо, это не то решение, которое вам нужно, но я подумал, что это будет полезным дополнением к проблеме.
Решение без re
Без re:
>>> x = "fffagggahhh"
>>> k = x.split('a')
>>> j = [k[0]] + ['a'+l for l in k[1:]]
>>> j
['fff', 'aggg', 'ahhh']
>>>
>>> r=re.compile("(a?[^a]+)")
>>> r.findall("fffagggahhh")
['fff', 'aggg', 'ahhh']
EDIT:
Это не будет правильно обрабатывать double a
в строке:
>>> r.findall("fffagggaahhh")
['fff', 'aggg', 'ahhh']
KennyTM re кажется более подходящим.
>>> rx = re.compile("(?:a|^)[^a]*")
>>> rx.findall("fffagggahhh")
['fff', 'aggg', 'ahhh']
>>> rx.findall("aaa")
['a', 'a', 'a']
>>> rx.findall("fgh")
['fgh']
>>> rx.findall("")
['']
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",""))
['']
Это работает при повторении 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
. Это может произойти только в начале входной строки.
>>> foo = "abbcaaaabbbbcaaab"
>>> bar = foo.split("c")
>>> baz = [bar[0]] + ["c"+x for x in bar[1:]]
>>> baz
['abb', 'caaaabbbb', 'caaab']
Из-за того, как работает нарезка, это будет работать исправно, даже если в foo
нет вхождений c
.
split()
принимает аргумент для разбиения символа:
>>> "fffagggahhh".split('a')
['fff', 'ggg', 'hhh']