【问题标题】:Regex - Python matching between string and first occurence正则表达式 - 字符串和第一次出现之间的 Python 匹配
【发布时间】:2016-10-14 08:35:01
【问题描述】:

无论我阅读了多少文档,我都很难掌握正则表达式。我正在尝试匹配字符串和& 第一次出现之间的所有内容,这就是我所拥有的

link =  "group.do?sys_id=69adb887157e450051e85118b6ff533c&&"
rex = re.compile("group\.do\?sys_id=(.?)&")
sysid = rex.search(link).groups()[0]

我正在使用https://regex101.com/#python 来帮助我验证我的正则表达式,我可以让rex = re.compile("user_group.do?sys_id=(.*)&") 工作,但.* 是贪婪的并且匹配最后一个& 我希望匹配第一个&

我认为.? 匹配 0 到 1 次

【问题讨论】:

  • 你的链接没有user_group,只有group
  • re.compile("user_group\.do\?sys_id=(.*?)&", re.S)
  • 抱歉,输入错误

标签: python regex


【解决方案1】:

这里不一定需要正则表达式。请改用urlparse

>>> from urlparse import urlparse, parse_qs 
>>> parse_qs(urlparse(link).query)['sys_id'][0]
'69adb887157e450051e85118b6ff533c'

如果是Python 3,将导入更改为:

from urllib.parse import urlparse, parse_qs

【讨论】:

  • 我在这里玩的太多了,我没有意识到这是 url 的一部分。不错的收获!
  • 那么 urlparse 比正则表达式更受欢迎吗?
  • @BrianSmith 一般来说,URL 可能非常复杂,严格来说,使用正则表达式解析或验证它可能与that 一样困难。换句话说,正则表达式是一种过于通用的工具,无法应用于 URL 解析。 urlparse 就是专门为此设计的。
  • 我同意@alecxe,他的解决方案更适合这项任务
【解决方案2】:

您可以像这样简单地将正则表达式输出到&amp 而不是最终的&

import re
link =  "user_group.do?sys_id=69adb887157e450051e85118b6ff533c&&"
rex = re.compile("user_group\.do\?sys_id=(.*)&&")
sysid = rex.search(link).groups()[0]

print(sysid)

【讨论】:

    【解决方案3】:
    .* 
    

    很贪心,但是

    .*? 
    

    不应该在正则表达式中。

    .? 
    

    只会查找任何字符 0-1 次,而

    .*? 
    

    将查找它直到最早的匹配出现。我希望这能解释清楚。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-02
      • 2016-09-28
      • 1970-01-01
      • 1970-01-01
      • 2016-03-18
      相关资源
      最近更新 更多