Найти - Пользователи
Полная версия: Как разбить строку на части в которых может быть разделитель?
Начало » Python для новичков » Как разбить строку на части в которых может быть разделитель?
1
fr0st84
Всем привет

такая задачка, нужно разбить такую строчку по разделителю ‘,’
проблема в том, что зн-нием разделенным ‘,’ может быть регулярка в “” включающая разделитель - ‘,’

str = 'reserved-memory,NO,NO,NO,,NO,"^({1,20})$",,,,,,,cache-policy=^(RESIDENT|NO_MIGRATION)$,,,'

>>> s.split(',')
['reserved-memory', ‘NO’, ‘NO’, ‘NO’, ‘', ’NO', '"^({1', ‘20})$“’, ‘', ’', ‘', ’', ‘', ’', ‘cache-policy=^(RESIDENT|NO_MIGRATION)$’, ‘', ’', '']

такой список - это то что мне нужно, только я хочу чтобы регулярка в ”" была 1 элементом списка.

вот так
['reserved-memory', ‘NO’, ‘NO’, ‘NO’, ‘', ’NO', '"^({1, 20})$"', ‘', ’', ‘', ’', ‘', ’', ‘cache-policy=^(RESIDENT|NO_MIGRATION)$’, ‘', ’', '']

какие есть идеи?

Спасибо )
s0rg
s = 'reserved-memory,NO,NO,NO,,NO,"^({1,20})$",,,,,,,cache-policy=^(RESIDENT|NO_MIGRATION)$,,,'
def comma_split(s):
    if s.count(',') > 1:
        return s.split(',')
    return s
def reduce_flat(a, b):
    if isinstance(b, list):
        a = a +  b
    else:
        a.append(b)
    return a
print reduce(reduce_flat, map(comma_split, s.split('"')), [])
Результат:
['reserved-memory', 'NO', 'NO', 'NO', '', 'NO', '', '^({1,20})$', '', '', '', '', '', '', '', 'cache-policy=^(RESIDENT|NO_MIGRATION)$', '', '', '']
py.user.next
>>> import io
>>> import csv
>>> 
>>> s = 'reserved-memory,NO,NO,NO,,NO,"^({1,20})$",,,,,,,cache-policy=^(RESIDENT|NO_MIGRATION)$,,,'
>>> 
>>> with io.StringIO(s) as sin:
...     lst = next(csv.reader(sin), [])
... 
>>> print(lst)
['reserved-memory', 'NO', 'NO', 'NO', '', 'NO', '^({1,20})$', '', '', '', '', '', '', 'cache-policy=^(RESIDENT|NO_MIGRATION)$', '', '', '']
>>>
fr0st84
Спасибо всем за ответы

>to s0rg
Ваш код не будет работать в случае если неск-ко ‘,’ присутствует в регулярке - “^({1,20}),,$”
>to py.user.next
спасибо, csv это то что нужно

я написал так:
Python 2.7.3 (default, Apr 14 2012, 08:58:41) on linux2
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import csv
>>> s = 'reserved-memory,NO,NO,NO,,NO,"^({1,20}),,$",,,,,,,cache-policy=^(RESIDENT|NO_MIGRATION)$,,,'
>>> csv.reader([s]).next()
['reserved-memory', 'NO', 'NO', 'NO', '', 'NO', '^({1,20}),,$', '', '', '', '', '', '', 'cache-policy=^(RESIDENT|NO_MIGRATION)$', '', '', '']
py.user.next
да, что-то я не догадался сразу
>>> s = 'reserved-memory,NO,NO,NO,,NO,"^({1,20})$",,,,,,,cache-policy=^(RESIDENT|NO_MIGRATION)$,,,'
>>> lst = next(csv.reader([s]), [])
>>> lst
['reserved-memory', 'NO', 'NO', 'NO', '', 'NO', '^({1,20})$', '', '', '', '', '', '', 'cache-policy=^(RESIDENT|NO_MIGRATION)$', '', '', '']
>>>
.next() в втретьем питоне нет
fr0st84
У нас используется питон 2.х, но я учту Ваше замечание.
Спасибо
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB