我有一个存储为type=str
的网址。看起来像这样:
url = 'http://www.dog.com/bone?junk=8dj37hf7'
我想删除所有以'?'开头的字符,所以我会:
url = 'http://www.dog.com/bone'
这是我尝试过的:
import re
re.sub('?junk=*', '', url)
但是我收到了这个错误:
引发错误,v#无效表达式 sre_constants.error:无需重复
这是解决方案:
import re
re.sub('\?junk=.*', '', url)
已编辑插入代码包围。 编辑添加。*表示法 Morten Jensen,但错误仍然存在。
编辑:解决'。*'和'\'转义。感谢Morten Jensen,jwodder,thefourtheye,et al。
答案 0 :(得分:4)
为什么不只是
url = url.split("?",1)[0]
正则表达式似乎试图用大锤杀死苍蝇
答案 1 :(得分:1)
引自http://docs.python.org/2/library/re.html#regular-expression-syntax
'?'
使得到的RE匹配0或1次重复 在RE之前。 AB?将匹配'a'或'ab'。
因此,您需要使用反斜杠
转义?
url = 'http://www.dog.com/bone?junk=8dj37hf7'
import re
print re.sub('\?.*', '', url)
<强>输出强>
http://www.dog.com/bone
答案 2 :(得分:1)
错误是因为正则表达式中的?
导致前一项成为可选项,但此处没有前面的项;要避免此行为,您需要使用反斜杠转义?
。同样,=*
将匹配零个或多个=
s,而不是一个=
,后跟任何内容=.*
。因此,为了得到你想要的东西,你需要使用:
re.sub(r'\?junk=.*', '', url)
答案 3 :(得分: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
答案 4 :(得分:0)
如果要解析网址,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'