2013-05-02 2 views
5

Я хотел бы разбить строку на символы: и. Однако я хотел бы игнорировать два пробела '' и два двоеточия '::'. например.Python разделил строку с помощью regex

text = "s:11011 i:11010 ::110011 :110010 d:11000" 

следует разделить на

[s,11011,i,11010,:,110011, ,110010,d,11000] 

после выполнения HOWTO регулярных выражений на сайте питона, я сумел comeup следующим

regx= re.compile('([\s:]|[^\s\s]|[^::])') 
regx.split(text) 

Однако это не работает надлежащим образом, как он разбивается на: и пробелы, но он по-прежнему включает «:» и «» в расколе.

[s,:,11011, ,i,:,11010, ,:,:,110011, , :,110010, ,d,:,11000] 

Как это исправить?

EDIT: В случае двойного пространства, я хочу только один пробел появится

+1

Если вы хотите избежать двойного пробела, почему в списке вы указали пробел в качестве ожидаемого результата? также вы ищете только регулярное выражение? – jurgenreza

+0

жаль, что я имел в виду, что в случае двойного пространства мне нужно только одно пространство. и никакое решение не должно быть регулярным ответом – misterMan

+0

Этот шаблон выглядит как ((\ s?). (:) [0-1] +) * ---> разделяет группы 1 и группы 2 – Civa

ответ

5

При этом предполагается, что данные имеют формат, как X:101010:

>>> re.findall(r'(.+?):(.+?)\b ?',text) 
[('s', '11011'), ('i', '11010'), (':', '110011'), (' ', '110010'), ('d', '11000')] 

Тогда chain их:

>>> list(itertools.chain(*_)) 
['s', '11011', 'i', '11010', ':', '110011', ' ', '110010', 'd', '11000'] 
3
>>> text = "s:11011 i:11010 ::110011 :110010 d:11000" 
>>> [x for x in re.split(r":(:)?|\s(\s)?", text) if x] 
['s', '11011', 'i', '11010', ':', '110011', ' ', '110010', 'd', '11000'] 
2

Использование регулярных выражений (?<=\d) |:(?=\d) расколоть:

>>> text = "s:11011 i:11010 ::110011 :110010 d:11000" 
>>> result = re.split(r"(?<=\d) |:(?=\d)", text) 
>>> result 
['s', '11011', 'i', '11010', ':', '110011', ' ', '110010', 'd', '11000'] 

Это разделится на:

(?<=\d) пространство, когда имеется цифра слева. Чтобы проверить это, я использую lookbehind assertion.

:(?=\d) двоеточие, когда есть цифра справа. Чтобы проверить это, я использую lookahead assertion.

0

Взгляните на этот шаблон:

([a-z\:\s])\:(\d+) 

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

Надеюсь, это поможет!