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