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

时间:2015-05-29 12:21:13

标签: python regex

循环浏览一些数据,我想捕获显示为页面ID的数字字符串(每行多于一行。)但是,我只想将数字字符串作为特定URL的一部分进行匹配,但我不想&#39 ; T想要记录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()只返回parens中匹配的部分?

2 个答案:

答案 0 :(得分:4)

  

re.findall()只能返回parens中的正则表达式部分吗?

不仅可以

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

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

答案 1 :(得分:1)

你可以使用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()将完全按照您的要求运行。