2011-01-14 163 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