我希望匹配包含特殊字符或以“http://”
开头的字词所以这句话
%他#llo,我的网站是:http://www.url.com/abcdef123
应该变成这个
我的网站
到目前为止,我有这个
re.sub(r"^[^\w]", " ", "%he#llo, my website is: http://www.url.com/abcdef123")
这只是删除符号,但它不会删除与符号关联的单词(它也不会删除':'和','),也不会删除URL。
答案 0 :(得分: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://
匹配,后跟一个或多个非空格字符。右边的部分匹配零个或多个非空格字符,后跟任何不是单词或空格字符的内容,后跟零个或多个非空格字符 - 确保您有一个至少有一个非字符串的字符串-word字符,没有空格。
更新:当然,正如其他答案暗示的那样,因为http://
前缀包含非单词字符(/
),所以您不需要作为替代方案 - 您可以将正则表达式简化为\S*[^\w\s]\S*
。但是,上面的例子可能仍然有用。
答案 1 :(得分:4)
您可以使用预测:
>>> re.findall(r"(?:\s|^)(\w+)(?=\s|$)", "Start %he#llo, my website is: http://www.url.comabcdef123 End")
['Start', 'my', 'website', 'End']
<强>解释强>
(?:\s|^)
表示我们的单词启动正则表达式或以空格开头。 (这个空间不属于这个词)。(\w+)
匹配一个单词(我们感兴趣的是)。(?=\s|$)
表示我们的单词后跟空格或字符串结尾。 (再一次,空间不属于这个词)。答案 2 :(得分: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")