【问题标题】:Python regular expression find first '&'Python正则表达式找到第一个'&'
【发布时间】:2015-03-24 13:29:10
【问题描述】:
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 如何匹配我想要的结果? 请指导一下,谢谢

【问题讨论】:

  • 这个网址看起来格式不正确 - 这是故意的吗?
  • 我同意,该 URL 看起来格式不正确。通常/54321&sa=U 将是/54321?sa=U(注意? 而不是& 以启动参数列表)。
  • 另外,已经有一个解析 URL 的模块:urlparse。为什么要在标准库中推出自己的标准库?

标签: python regex url


【解决方案1】:

您获得该输出的原因是因为 *.让它变得懒惰:

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]

【讨论】:

  • 如果找不到&,那么您最终会使用find 解决方案删除输入字符串的最后一个字符。
【解决方案2】:

使用积极的前瞻断言。

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

    这个怎么样?

    这也保证了如果没有找到'&',将返回整个字符串。您不会遇到结果为 ''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 方法轻松地做到这一点。

    【讨论】:

    • Python 中没有“void”这样的东西。你的意思是None,还是空字符串?从上下文中不清楚您所说的“无效”是什么。无论如何,如果找不到&,您的解决方案会从字符串中删除最后一个字符,因此它并不能真正正确处理这种情况。
    • @DaoWen 我在那里很马虎。你说得对。 OP 早些时候在其他人的回答中发表了评论,他表示担心如果找不到'&',结果将是无效的。他真的只是说None,但我用他的术语(懒惰地)来解决他的担忧。已修复,谢谢。
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      不使用正则表达式。

      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'
      

      【讨论】:

      • 您可能还想限制拆分:link.split('&', 1)
      【解决方案6】:

      另一种解决方案;

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

      【讨论】:

      • 这将打印多个结果,一旦它到达第二个'&'。使用break
      猜你喜欢
      • 2013-05-18
      • 2017-10-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-25
      • 2018-06-09
      • 2015-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多