2013-08-27 192 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 
相關問題