Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正则表达式。匹配包含特殊字符或';http://';_Python_Regex - Fatal编程技术网

Python 正则表达式。匹配包含特殊字符或';http://';

Python 正则表达式。匹配包含特殊字符或';http://';,python,regex,Python,Regex,我想匹配包含特殊字符或以“http://”开头的单词 所以这句话 %他#llo,我的网站是: 应该变成这样 我的网站 到目前为止,我有这个 re.sub(r"^[^\w]", " ", "%he#llo, my website is: http://www.url.com/abcdef123") 这只会删除符号,但不会删除与符号相关联的单词(也不会删除“:”和“,”),也不会删除URL。不使用regexs,但这可能有效吗?(我假设“:”和“/”是特殊字符,因此它将隐式删除URL) 您可以使用l

我想匹配包含特殊字符或以“http://”开头的单词

所以这句话

%他#llo,我的网站是:

应该变成这样

我的网站

到目前为止,我有这个

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

这只会删除符号,但不会删除与符号相关联的单词(也不会删除“:”和“,”),也不会删除URL。

不使用regexs,但这可能有效吗?(我假设“:”和“/”是特殊字符,因此它将隐式删除URL)


您可以使用look 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 |)
    表示我们的单词后面是空格或字符串的结尾。(同样,空格不属于这个词)

对于您给出的示例字符串,以下正则表达式可以正常工作:

>>> 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*
。但是,上面的例子中的替换可能仍然有用。

顺便说一句,你的问题标题是“以特殊字符开头的单词”,而问题的文本是“包含特殊字符的单词”。您可能想更改标题,使其保持一致。效果很好!不过我还有一个问题。如果我想保留所有以标点符号结尾(或仅包含标点符号)的单词怎么办?您可以使用
[^\w\s]
来代替
[^\w\s],]
来表示您想保留其中包含“,”或“,”的单词。e、 g.
re.sub('(^ |\s)(http://\s+|[^\w\s',]\s*),'\\1','%he#llo,我的“所谓”,网站是:http://www.url.com/abcdef123“
会给你
”我的“所谓”网站是:“
@user216171不客气。我现在注意到我不小心用了一个不同的(不正确的)regexp在那条评论中,但现在纠正它已经太晚了-无论如何,我希望想法是清楚的…如果这个词包含一个数字怎么办?例如web5site。似乎包含数字的词仍然包括在内。
>>> re.sub('(http://\S+|\S*[^\w\s]\S*)','',a)
' my website  '