0

我有一个 url 存储为type=str. 看起来像这样:

url = 'http://www.dog.com/bone?junk=8dj37hf7'

我想删除所有以“?”开头的字符,所以我会:

url = 'http://www.dog.com/bone'

这是我尝试过的:

import re
re.sub('?junk=*', '', url)

但我得到这个错误:

raise error, v # invalid expression sre_constants.error: nothing to repeat

这是解决方案:

import re
re.sub('\?junk=.*', '', url)

编辑插入代码括号。编辑为每个 Morten Jensen 添加 .* 符号,但错误仍然存​​在。

编辑:解决了 '.*' 和 '\' 转义。感谢 Morten Jensen、jwodder、thefourtheye 等人。

4

5 回答 5

5

为什么不只是

url = url.split("?",1)[0]

正则表达式似乎想在这里用大锤杀死一只苍蝇

于 2013-11-07T01:08:28.237 回答
1

引用http://docs.python.org/2/library/re.html#regular-expression-syntax

'?'

导致生成的 RE 匹配前面 RE 的 0 或 1 次重复。ab? 将匹配“a”或“ab”。

所以,你需要?用反斜杠转义

url = 'http://www.dog.com/bone?junk=8dj37hf7'
import re
print re.sub('\?.*', '', url)

输出

http://www.dog.com/bone
于 2013-11-07T01:01:53.703 回答
1

错误是因为?在正则表达式中导致前面的项目成为可选的,但这里没有前面的项目;为避免这种行为,您需要?使用反斜杠转义。类似地,=*将匹配零个或多个=s,而不是一个=后跟任何内容,即=.*. 因此,要得到你想要的,你需要使用:

re.sub(r'\?junk=.*', '', url)
于 2013-11-07T01:03:40.087 回答
1

你可以试试thefourtheye所说的,或者可能是这样的:

>>> url = 'http://www.dog.com/bone?junk=8dj37hf7'
>>> newurl = url[:url.find('?')]
>>> print newurl

http://www.dog.com/bone

这种方法也更快,这里是证明:

In [2]: url = 'http://www.dog.com/bone?junk=8dj37hf7'

In [3]: %timeit newurl = url[:url.find('?')]
1000000 loops, best of 3: 423 ns per loop

In [4]: import re

In [5]: %timeit x = re.sub('\?.*', '', url)
100000 loops, best of 3: 3.1 us per loop

In [6]: %timeit x = re.sub('\?.*', '', url)
100000 loops, best of 3: 3.25 us per loop
于 2013-11-07T01:04:08.723 回答
1

如果你想解析 url,urlparse是更好的方法。

from urlparse import urlparse

url = 'http://www.dog.com/bone?junk=8dj37hf7'
parsed = urlparse(url)
real_url = "http://{0}{1}".format(parsed.hostname, parsed.path)

输出:

'http://www.dog.com/bone'
于 2013-11-07T01:16:43.123 回答