2016-02-05 680 views
2

我有2個相關的問題/問題。Python從字符串中刪除分隔符

def remove_delimiters (delimiters, s): 
    for d in delimiters: 
     ind = s.find(d) 
     while ind != -1: 
      s = s[:ind] + s[ind+1:] 
      ind = s.find(d) 

    return ' '.join(s.split()) 


delimiters = [",", ".", "!", "?", "/", "&", "-", ":", ";", "@", "'", "..."] 
d_dataset_list = ['hey-you...are you ok?'] 
d_list = [] 

for d in d_dataset_list: 
    d_list.append(remove_delimiters(delimiters, d[1])) 

print d_list 

輸出= 'heyyouare you ok'

  1. 什麼是當一個分隔符被移除組合在一起避免串的最佳方式?例如,這樣的輸出是hey you are you ok

  2. 可能有一些...不同的序列,例如............等如何去實現左右某種形式的規則,其中如果超過一個.後對方出現,將其刪除?我想嘗試避免在我的分隔符列表中硬編碼所有序列。三江源

+0

您的分隔符列表中的一個點,但隨後你問我們如何刪除兩個或者多個點。這是什麼,單點應該留下還是不留? – timgeb

回答

4

你可以嘗試這樣的事:

  1. 鑑於符d,他們加入到一個正則表達式

    >>> d = ",.!?/&-:;@'..." 
    >>> "["+"\\".join(d)+"]" 
    "[,\\.\\!\\?\\/\\&\\-\\:\\;\\@\\'\\.\\.\\.]" 
    
  2. 分割使用此正則表達式的字符串re.split

    >>> s = 'hey-you...are you ok?' 
    >>> re.split("["+"\\".join(d)+"]", s) 
    ['hey', 'you', '', '', 'are you ok', ''] 
    
  3. 加入所有非空的碎片重新走到一起

    >>> ' '.join(w for w in re.split("["+"\\".join(d)+"]", s) if w) 
    'hey you are you ok' 
    

此外,如果你只是想刪除所有非單詞字符,你可以使用的字符組\W,而不是手動枚舉所有分隔符:

>>> ' '.join(w for w in re.split(r"\W", s) if w) 
'hey you are you ok' 
0

所以首先,你去除分隔符的功能,可以極大地利用替換功能簡化(http://www.tutorialspoint.com/python/string_replace.htm

這將有助於解決您的第一個問題。而不是僅僅刪除它們,更換一個空間,然後使用你已經使用的模式擺脫空間(分割()把連續的分隔符視爲一個)

更好的功能,這是這種情況,應該是:

def remove_delimiters (delimiters, s): 
    new_s = s 
    for i in delimiters: #replace each delimiter in turn with a space 
     new_s = new_s.replace(i, ' ') 
    return ' '.join(new_s.split()) 

回答你的第二個問題,我會說這是一次對正則表達式

>>> import re 
... ss = 'hey ... you are ....... what?' 
... print re.sub('[.+]',' ',ss) 
hey  you are   what? 
>>>