2011-01-14 162 views
4

我想匹配包含特殊字符或與開頭的單詞:所以這句話正則表達式。

%,他#的「http //」:包含特殊字符或「// HTTP」比賽的話LLO,我的網站是:http://www.url.com/abcdef123

應該變成這個

我的網站

到目前爲止,我有這個

re.sub(r"^[^\w]", " ", "%he#llo, my website is: http://www.url.com/abcdef123") 

這只是刪除了符號,但它不會刪除與符號(它也不會刪除相關的話「:」和「」 ),也不會刪除該URL。

+1

順便說一句,您的問題標題中顯示「以特殊字符開頭的單詞」,而問題文本顯示「含有特殊字符」。您可能需要更改標題以保持一致。 – 2011-01-14 20:11:46

回答

6

對於你給的例子字符串,下面的正則表達式工程確定:

>>> a = '%he#llo, my website is: http://www.url.com/abcdef123' 
>>> re.findall('(http://\S+|\S*[^\w\s]\S*)',a) 
['%he#llo,', 'is:', 'http://www.url.com/abcdef123'] 

...或者你可以刪除這些詞語與re.sub

>>> re.sub('(http://\S+|\S*[^\w\s]\S*)','',a) 
' my website ' 

|指和交替將匹配組內任一側的表達。左邊的部分匹配http://後跟一個或多個非空格字符。右邊的部分匹配零個或多個非空格字符,後面跟着任何不是字或空格字符的字符,後跟零個或多個非空格字符 - 確保您有至少一個非空字符的字符串字符並且沒​​有空格。

更新時間:當然,作爲其他的答案隱含建議,因爲http://前綴包含非字字符(/),你不需要有作爲替代 - 你可以簡化正則表達式\S*[^\w\s]\S*。不過,也許上面的替代例子仍然有用。

+0

很棒!我還有另一個問題。如果我想保留所有以(或僅包含)標點符號結尾的單詞怎麼辦? – user216171 2011-01-14 20:52:00

2

不使用正則表達式,但也許這可以工作? (我假設 ':' 和 '/' 是特殊字符,所以它會隱式刪除URL)

def good_word(word): 
    import string 
    for c in word: 
     if not c in string.ascii_letters: 
      return False 
    return True 

def clean_string(str): 
    return ' '.join([w for w in input.split() if good_word(w)]) 

print clean_string("%he#llo, my website is: http://www.url.com/abcdef123") 
4

你可以用一下aheads:

>>> re.findall(r"(?:\s|^)(\w+)(?=\s|$)", "Start %he#llo, my website is: http://www.url.comabcdef123 End") 
['Start', 'my', 'website', 'End'] 

說明:

  • (?:\s|^)意味着我們的詞開始正則表達式或由一個空間。 (並且該空間不屬於該詞)。
  • (\w+)匹配一個詞(並且是我們感興趣的)。
  • (?=\s|$)表示我們的單詞之後是空格或字符串的結尾。 (再一次,空間不屬於這個詞)。
+0

如果這個詞包含一個數字會怎麼樣?例如web5site。看起來包含數字的單詞仍然包含在內。 – 2014-09-15 05:08:02