Python正则表达式首先找到'&'

时间:2015-01-26 04:52:22

标签: python regex url

link = "http://blog.test.com/54321&sa=U&ei=1sTFVJLfOtOC8gW0jIHYCw&ved=0CBMQFjAA"
pat = re.compile("(.*)\&(.*)")
match = re.search(pat,link)
print match.group(1)

结果为http://blog.test.com/54321&sa=U&ei=1sTFVJLfOtOC8gW0jIHYCw

但我需要的是http://blog.test.com/54321 如何匹配我想要的结果? 请指导我,谢谢

6 个答案:

答案 0 :(得分:5)

不使用Regex。

link = "http://blog.test.com/54321&sa=U&ei=1sTFVJLfOtOC8gW0jIHYCw&ved=0CBMQFjAA"

_link = link.split('&',1)
result = _link[0]

>>print result
>>'http://blog.test.com/54321'

答案 1 :(得分:2)

你得到那个输出的原因是因为*的贪婪。为了使它变得懒惰:

link = "http://blog.test.com/54321&sa=U&ei=1sTFVJLfOtOC8gW0jIHYCw&ved=0CBMQFjAA"
pat = re.compile("(.*?)\&")
match = re.search(pat,link)
print match.group(1)

注意新模式中的?

对于这种简单的情况,我建议使用内置解决方案:

print link.split('&')[0]

答案 2 :(得分:0)

使用积极的先行断言。

pat = re.compile(r"^.*?(?=&)")
match = re.search(pat,link)
print match.group()

没有正则表达式,

>>> link = "http://blog.test.com/54321&sa=U&ei=1sTFVJLfOtOC8gW0jIHYCw&ved=0CBMQFjAA"
>>> s = ""
>>> for i in link:
        if i == '&':
            print(s)
            break
        else:
            s += i


http://blog.test.com/54321

答案 3 :(得分:0)

这个怎么样?

这也保证了如果找不到'&',将返回整个字符串。如果结果为''None,或者不返回字符串的任何部分,则不会出现问题。

>>> link = "http://blog.test.com/54321&sa=U&ei=1sTFVJLfOtOC8gW0jIHYCw&ved=0CBMQFjAA"

>>> symbolIndex = link.find('&')
>>> print link[:symbolIndex] if symbolIndex >= 0 else link

'http://blog.test.com/54321'

在这些情况下,不需要正则表达式。您可以使用常规str方法轻松完成相同操作。

答案 4 :(得分:0)

另一种解决方案;

link = "http://blog.test.com/54321&sa=U&ei=1sTFVJLfOtOC8gW0jIHYCw&ved=0CBMQFjAA"
for i in link:
    if i == "&":
        ind=link.index("&")
        print (link[:ind])
        break

输出;

>>> 
http://blog.test.com/54321
>>>

或使用正则表达式;

link = "http://blog.test.com/54321&sa=U&ei=1sTFVJLfOtOC8gW0jIHYCw&ved=0CBMQFjAA"
t = re.search("&",link).group()
if t:
    ind=link.index(t)
    print (link[:ind])

输出;

>>> 
http://blog.test.com/54321
>>> 

答案 5 :(得分:0)

使用正则表达式并处理/&之间的数字。

In[2]: import re
In[3]: link = "http://blog.test.com/54321&sa=U&ei=1sTFVJLfOtOC8gW0jIHYCw&ved=0CBMQFjAA"
In[4]: re.findall('^.+/\d+(?=&)',link)
Out[4]: ['http://blog.test.com/54321']