2012-03-22 2 views
3

Я использую regex [,; \ s] + для разделения строки, разделенной запятой, пробелом или точкой с запятой. Это хорошо работает, если строка не содержит запятой в конце:разделение запятой, пробелом или точкой с запятой с использованием regex

>>> p=re.compile('[,;\s]+') 
>>> mystring='a,,b,c' 
>>> p.split(mystring) 
['a', 'b', 'c'] 

Когда строка имеет запятую в конце:

>>> mystring='a,,b,c,' 
>>> p.split(mystring) 
['a', 'b', 'c', ''] 

Я хочу выход в этом случае не должен быть [ 'a', 'b', 'c'].

Любые предложения по регулярному выражению?

+2

это за файл CSV – John

+0

@johnthexiii Нету – ghostcoder

ответ

5

Try:

str = 'a,,b,c,' 
re.findall(r'[^,;\s]+', str) 
+0

Спасибо Qtax. Это работает – ghostcoder

7

Вот что-то очень низкая техническая что должно работать:

mystring='a,,b,c' 
for delim in ',;': 
    mystring = mystring.replace(delim, ' ') 
results = mystring.split() 

PS: Хотя регулярные выражения очень полезны, я бы настоятельно рекомендуем дважды подумать о том, является ли это правильный инструмент для работы здесь. Хотя я не уверен, что такое точное время выполнения скомпилированного регулярного выражения (я думаю не более O (n^2)), он определенно не быстрее O (n), который является временем выполнения string.replace. Так что, если нет другой причины, по которым вы должны использовать регулярное выражение, вы должны быть установлены с помощью этого решения

+0

Благодаря inspectorG4dget для PS. – ghostcoder

3

Ну, раскол технически сделал работы. В a,,b,c он разбивается на ,, и ,, оставляя «a», «b» и «c». В a,,b,c, он разбивается на ,,, , и последние , (потому что все они соответствуют регулярному выражению!). Строками «вокруг» этих делителей являются «a», «b», «c» и «» (между последней запятой и концом строки).

Существует несколько способов обойти это.

  • пустая строка будет происходить только тогда, когда есть ограничитель в начале или в конце строки, поэтому обрезать любого из этих [,;\s] до расщепления с помощью str.strip:

    p.split(mystring.strip(',; \t\r\n')) 
    
  • Удалить пустой строка после расщепления, используя любой метод вы пожалуйста

    res = p.split(mystring) 
    [r for r in res if r != ''] 
    # another option 
    filter(None,res) 
    
  • Еще лучше, так как вы знаете, вы будете только получать е строка mpty как первая или последняя часть разделенной строки (например, ,a,b,c или a,b,c,), не перебирать весь раскол:

    res = p.slit(mystring) 
    # this one relies on coercing logical to numbers: 
    # if res[0] is '' it'll be 1:X, otherwise it'll be 0:X, 
    # where X is len(res) if res[-1] is not '', and len(res)-1 otherwise. 
    res[ res[0]=='':(len(res)-(res[-1]==''))] 
    
+0

Спасибо за подробное объяснение. – ghostcoder

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