2013-08-27 4 views
0

Следующий код делает то, что я хочу:Упрощение Python строки регулярное выражение/шаблону

if myString.startswith(", "): 
    myString = myString.lstrip(", ") 
if myString.endswith(", "): 
    myString = myString.rstrip(", ") 
if re.search(", ,", myString): 
    myString = re.sub(", ,", "", myString) 

В принципе, я хочу, чтобы удалить все ведущие запятые, конечные запятые, и где-нибудь две запятые появляются без ничего между ними. Это делает трюк, но я уверен, что есть способ упростить это, чтобы сделать его более элегантным и использовать меньше строк кода.

Любые предложения действительно будут оценены. Заранее спасибо!

+1

число строк кода = упрощение. Почему бы просто не запускать lstrip, rstrip и re.sub, если он не может найти совпадений, он вернет неизмененную строку –

ответ

8

Для стартера, я хотел бы использовать .strip, который имеет как rstrip и lstrip. А потом заменить на две запятые:

MyString = MyString.strip(", ").replace(", , ", "") 
+0

аккуратный один лайнер. –

+0

Очень полезно, спасибо! – AndroidNoobie

2

Использование split + join:

>>> s = ', a, b, ,c, ' 
>>> ', '.join(x for x in map(str.strip, s.split(',')) if x) 
'a, b, c' 
1

Вы можете использовать re.sub:

import re 
myString = re.sub('^, |, $|, ,', '', myString) 
+0

Также очень хороший ответ, спасибо! – AndroidNoobie

0

Вы, вероятно, хотите, что, заменен, вместо ничего.

>>> " ,a,b,,c, ".strip(' ,').replace(',,', ',') 
'a,b,c' 
1

код из ответов по сравнению с timeit:

s = ", 1, 2, , 3, 4, , 5, 6, , 7, 8, , 9, 10, , 11, 12, , 13, 14, , 15, 16 ," 

def f1(s): 
    s = s.strip(", ").replace(", , ", "") 

def f2(s): 
    s = ', '.join(x for x in map(str.strip, s.split(',')) if x) 

def f3(s): 
    s = re.sub('^, |, $|, ,', '', s) 

if __name__ == '__main__': 
    import timeit, re 

    print(timeit.timeit("f1(s)", setup="from __main__ import f1, s")) 
    print(timeit.timeit("f2(s)", setup="from __main__ import f2, s")) 
    print(timeit.timeit("f3(s)", setup="from __main__ import f3, s")) 

Результаты (на мой нетбук):

1.44931602478 
13.0764448643 
11.3456158638