2009-08-13 73 views
5

我有一個字符串類型的,看起來像這樣:崩潰空白的字符串

"stuff . // : /// more-stuff .. .. ...$%$% stuff -> DD" 

,我想脫掉所有的標點,使一切大寫和摺疊所有空格,這樣,它看起來像這樣:

"STUFF MORE STUFF STUFF DD" 

這可能與一個正則表達式或我需要結合兩個以上?這是我到目前爲止:

def normalize(string): 
    import re 

    string = string.upper() 

    rex = re.compile(r'\W') 
    rex_s = re.compile(r'\s{2,}') 

    result = rex.sub(' ', string) # this produces a string with tons of whitespace padding 
    result = rex.sub('', result) # this reduces all those spaces 

    return result 

唯一不起作用的是空白崩潰。有任何想法嗎?

回答

15

這裏有一個單一步驟的方法(但實際上uppercasing使用字符串方法 -​​ 簡單多了!):

rex = re.compile(r'\W+') 
result = rex.sub(' ', strarg).upper() 

其中strarg是字符串參數(使用的名稱該陰影內置或標準庫模塊,)。

+0

我同意這肯定是解決問題的更簡單方法。 – Amber 2009-08-13 22:19:09

+1

我認爲在rex.sub的參數中應該是「string」而不是「result」或者這只是取代用戶代碼的一部分? – 2009-08-14 00:37:27

+1

@Brooks,你是對的 - 我很厭惡內建和標準模塊名稱,任何東西但是我的指尖飛濺。讓我編輯修復,謝謝! – 2009-08-14 01:44:21

3
result = rex.sub(' ', string) # this produces a string with tons of whitespace padding 
result = rex.sub('', result) # this reduces all those spaces 

因爲你打字並忘記用rex_s代替第二個電話。此外,您需要將至少一個空間替換回來,否則您將最終產生任何多空間差距,而不是單一空間差距。

result = rex.sub(' ', string) # this produces a string with tons of whitespace padding 
result = rex_s.sub(' ', result) # this reduces all those spaces 
+0

良好的漁獲物。我只是注意到發佈後的那些時刻。在我有機會編輯OMG之前,你打敗了我 – priestc 2009-08-13 22:22:43

+0

我建議看一下Alex的代碼 - 它更接近問題的簡潔方式,它也很好地處理字符串末尾的標點符號/空格。 – Amber 2009-08-13 22:29:28

1

你必須使用正則表達式嗎?你覺得你必須在一行中做到這一點?

>>> import string 
>>> s = "stuff . // : /// more-stuff .. .. ...$%$% stuff -> DD" 
>>> s2 = ''.join(c for c in s if c in string.letters + ' ') 
>>> ' '.join(s2.split()) 
'stuff morestuff stuff DD' 
3
s = "$$$aa1bb2 cc-dd ee_ff ggg." 
re.sub(r'\W+', ' ', s).upper() 
# ' AA1BB2 CC DD EE_FF GGG ' 

是_標點符號?

re.sub(r'[_\W]+', ' ', s).upper() 
# ' AA1BB2 CC DD EE FF GGG ' 

不希望前導和尾隨空間?

re.sub(r'[_\W]+', ' ', s).strip().upper() 
# 'AA1BB2 CC DD EE FF GGG' 
+0

+1用於繞過're.compile(...)'步驟。如果可以的話,我會再給你一個+1來指出如何處理'_'和前/後WS,因爲這些東西經常被正則表達式忽略。 – 2009-08-14 01:55:18

1

在python3中起作用,這將保留與摺疊相同的空白字符。所以如果你有一個選項卡和一個空格,他們不會合併爲一個字符。

def collapse_whitespace_characters(raw_text): 
    ret = '' 
    if len(raw_text) > 1: 
     prev_char = raw_text[0] 
     ret += prev_char 
     for cur_char in raw_text[1:]: 
      if not cur_char.isspace() or cur_char != prev_char: 
       ret += cur_char 
      prev_char = cur_char 
    else: 
     ret = raw_text 
    return ret 

這個人會壓縮空白組到第一空白字符它看到

def collapse_whitespace(raw_text): 
    ret = '' 
    if len(raw_text) > 1: 
     prev_char = raw_text[0] 
     ret += prev_char 
     for cur_char in raw_text[1:]: 
      if not cur_char.isspace() or \ 
        (cur_char.isspace() and not prev_char.isspace()): 
       ret += cur_char 
      prev_char = cur_char 
    else: 
     ret = raw_text 
    return ret 

> > > collapse_whitespace_characters('我們 像       空間   和\ t \ t   TABS       AND   WHATEVER \ xa0 \ xa0IS')
'我們喜歡的空間和\ t TABS \ t和WHATEVER \ xa0IS'

> > > collapse_whitespace('我們 像       空間   和\ t \ t   TABS      和  WHATEVER \ XA0 \ xa0IS')
'我們喜歡標點符號空間和\ tTABS \ t和WHATEVER \ xa0IS'

def collapse_punctuation(raw_text): 
    ret = '' 
    if len(raw_text) > 1: 
     prev_char = raw_text[0] 
     ret += prev_char 
     for cur_char in raw_text[1:]: 
      if cur_char.isalnum() or cur_char != prev_char: 
       ret += cur_char 
      prev_char = cur_char 
    else: 
     ret = raw_text 
    return ret 

實際回答這個問題

orig = 'stuff . // : /// more-stuff .. .. ...$%$% stuff -> DD' 
collapse_whitespace(''.join([(c.upper() if c.isalnum() else ' ') for c in orig])) 

的說,正則表達式會是這樣的類型部分

re.sub('\W+', ' ', orig).upper()