2016-05-24 2 views
1

Я хочу разбить следующие значения, используя несколько разделителей +/,.;. Все остальные знаки не должны использоваться в качестве разделителей.Как добавить ограничение на разбиение на основе нескольких разделителей?

Например,

CAP.44,45+62(400) 
e.morgan,44+32/78 

Я написал следующий код:

import re 
data['COUNT'] = data['STRING_VALS'].apply(lambda x: len(re.findall(r'[+/,.; ]+', x))) 

Проблема заключается в том, что . может иметь исключение. Он не должен использоваться в качестве разделителя в случае следующей маски _.___. Итак, если есть один символ до . и любое количество символов после ., то _.___ не следует разделить.

Как добавить такое ограничение на маску к указанному выше коду?

+0

Как насчет 'a.b.c'? Сколько частей нужно разбить? –

+0

@AlexHall: Затем его следует разделить на 3 части. – JoeBlack

+0

Это не то, чего я ожидал. Таким образом, вы хотите избежать расщепления на точке, только если есть один неточечный символ раньше и более одного после? Должен ли 'a.bb.c.dd' разбиваться на' a.bb' и 'c.dd'? –

ответ

1

Вы можете использовать отрицательный lookbehind и отрицательный lookahead. Что-то вроде:

r'[\s+/,;]|(?<!_)[.](?!___)'

Такой, что:

p = re.compile(r'[\s+/,;]|(?<!_)[.](?!___)') re.split(p, 'CAP.44,45+62(400)')

возвращается: ['CAP', '44', '45', '62(400)']

Но

re.split(p, '_.___') возвращает: ['_.___']

+0

Спасибо. Я протестировал его. Небольшая проблема заключается в том, что строки, такие как 'tyt-21-47-rut', имеют длину 3 вместо 4. – JoeBlack

+0

Извините, я не совсем понимаю, что вы имеете в виду. – Proghero

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