【问题标题】:Can re.findall() return only the part of the regex in parens?re.findall() 可以只返回括号中正则表达式的一部分吗?
【发布时间】:2015-05-29 12:21:13
【问题描述】:

循环遍历一些数据,我想捕获显示为页面 ID 的数字字符串(每行不止一个。)但是,我只想将数字字符串匹配为特定 URL 的一部分,但我不想想记录网址,只是数字。

URL 是相对的,具有可变长度的数字字符串,格式为

/view/123456.htm

这里要返回的数据是'123456'

我目前正在使用 re.findall 来识别正确的 URL,然后使用 re.sub 来提取数字字符串。

views = re.findall(r"/view/\d*?.htm", line)
for view in views:
    view = re.sub(r"/view/(\d+).htm", r"\1", view)
    pagelist.append(view)

有没有办法做类似的事情

views = re.findall(r"/view/(\d*?).htm", r"\1", line)   #I know this doesn't work

原来的 findall() 只返回括号中的匹配部分?

【问题讨论】:

  • edit您的问题,并包括一些您想要匹配的示例 URL 以及每个 URL 所需的输出。
  • @LutzHorn 你到底有什么不清楚的地方?
  • @hek2mgl 我可以猜测这个问题是关于什么的。但是,如果问题包含所需的输入和输出,那么这个问题和作为网站的 SO 的质量将会提高。
  • 基本上我和你在一起,但我不会错过这篇文章中的任何内容。 100% 清楚应该匹配什么,问题更多是关于如何在 python 中有效地访问匹配结果。

标签: python regex


【解决方案1】:

re.findall() 可以只返回括号中正则表达式的一部分吗?

它不仅可以,而且可以

>>> import re
>>> re.findall(r"/view/(\d*?).htm", "/view/123.htm /view/456.htm")
['123', '456']

你没试过吗? The documentation 也有描述。

【讨论】:

    【解决方案2】:

    您可以使用a lookbehind and a lookahead assertion 使 findall 只返回数字。例如:

    >>> re.findall(r"(?<=/view/)\d*?(?=\.htm)", "/view/123.htm /view/456.htm")
    ['123', '456']
    

    这类断言可用于定义匹配前后的内容 - 无需将它们包含在实际匹配中。

    更新:请检查Stefan Pochmann's answer,如果您只使用单个捕获组,findall() 将完全按照您的要求行事。

    【讨论】:

    • 实际上,如果有任何组,则只返回一个包含其内容的列表 findall 所做的。
    • @StefanPochmann LOL :D 这很有趣!特别是因为我在发布之前真的阅读了文档!我担心多个捕获组,但在这种情况下只有 一个
    • 是的,如果有几个组,那么希望因为他们是需要的,然后它也能正常工作。顺便说一句,起初我也认为它没有这样做,但可能只是因为这个问题的暗示力量:-)
    • if there were several groups, then hopefully because they're wanted - 好点!感谢您启发我们! :)
    猜你喜欢
    • 1970-01-01
    • 2015-11-13
    • 2019-04-05
    • 1970-01-01
    • 2020-04-13
    • 1970-01-01
    • 2010-09-07
    • 2011-08-24
    相关资源
    最近更新 更多