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

Python regular expression find first '&'

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 如何匹配到我想要的结果? 请指导我,谢谢

使用积极的先行断言。

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

不使用正则表达式。

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'

这个怎么样?

这也保证了如果没有找到'&',将返回整个字符串。您不会遇到结果为 ''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 方法轻松完成相同的操作。

另一种解决方案;

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
>>> 

你得到那个输出的原因是因为 *.让它变得懒惰:

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]

使用正则表达式并计算 /& 之间的任何数字。

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']