正则表达式:匹配包含特殊字符或'http://'的单词

4 投票
3 回答
14747 浏览
提问于 2025-04-16 09:58

我想找到那些包含特殊字符或者以 'http://' 开头的词。

比如这句话:

%he#llo, 我的网页是: http://www.url.com/abcdef123

应该变成这样:

我的网页

到目前为止,我有这个:

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

这段代码只是去掉了符号,但没有去掉和这些符号相关的词(也没有去掉 ':' 和 ','),更没有去掉网址。

3 个回答

2

这里不是在用正则表达式,但也许这样做可以有效?(我假设':'和'/'是特殊字符,所以它会隐含地去掉网址)

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

你可以使用前瞻匹配:

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

解释:

  • (?:\s|^) 的意思是我们的单词要么是正则表达式的开头,要么前面有一个空格。(而这个空格不算在单词里)。
  • (\w+) 匹配一个单词(这正是我们关心的内容)。
  • (?=\s|$) 的意思是我们的单词后面要么是空格,要么是字符串的结尾。(同样,这个空格也不算在单词里)。
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*。不过,上面的带有“或者”的例子可能还是有用的。

撰写回答