用re.sub。截断字符串

时间:2013-11-07 00:59:33

标签: python regex

我有一个存储为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。

5 个答案:

答案 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'