首页 > 解决方案 > 澄清正则表达式功能/.findall() 返回不在捕获组中的匹配项

问题描述

似乎我无法将注意力集中在正则表达式上。

我的字符串:

<h1 id="jdp-title-job-title2">Manager Global E-Commerce (m/f/d)</h1>
<h1 id="jdp-title-job-title"></h1>
<h5>We are looking for a new colleague in ZF Aftermarket’s Global Digital Team at our location in Neuwied.
Req Id: 40112BR</h5>
<h6>Your tasks as Manager Global E-Commerce (m/f/d): </h6>

第一次正则表达式尝试

(?<=>).+(?=<)

使用前瞻/后视似乎是个好主意,因为它不是我不想要的标签字符。它符合我从上面的字符串中需要的东西,但是

re.findall(r'(?<=>).+(?=<)', s)

返回完整的搜索字符串。为什么?(在括号中设置“.+”以使其成为捕获组无济于事。

第二次正则表达式尝试

<(h[1-9]).*<\/\1>

是第二种方法。它匹配整个事物,包括标签。然而

re.findall(r'<(h[1-9]).*<\/\1>', s)

结果是

0 = {str} 'h1'
1 = {str} 'h5'
2 = {str} 'h6'

这并不奇怪,因为捕获组 1 仅围绕着盯着标签。结合收集到的知识有:

第三次正则表达式尝试

<(h[1-9]).*>(.+)<\/\1>

Lookahed/lookbehind 不适用于 .* 所以我尝试制作我想要第二个捕获组的字符串部分。不幸的是我的代码:

re.findall(r'<(h[1-9]).*>(.+)<\/\1>', s)

返回完整的胡言乱语

 0 = {tuple} 
 0 = {str} 'h1'
 1 = {str} '\r <h1 id="jdp-title-job-title">'
 __len__ = {int} 2

 1 = {tuple}  
 0 = {str} 'h5'
 1 = {str} 'We are looking for a new colleague in ZF Aftermarket’s Global 
 Digital Team at our location in Neuwied.\r Req Id: 40112BR'
 __len__ = {int} 2

那里甚至有些东西与这个正则表达式不匹配,或者不是捕获组的一部分,或者是多行的(如 h5 的内容)。我不明白发生了什么事。

我想要的是

首先,我想了解发生了什么。其次,我需要上面给出的字符串中的 HTML 标记所包含的内容。

我想要的输出如下所示:

0 = {tuple}
0 = {str} 'Manager Global E-Commerce (m/f/d)'

1 = {tuple}
0 = {str} 'Your tasks as Manager Global E-Commerce (m/f/d): '

奖励:理想情况下,正则表达式也匹配 h5 标签的多行内容,但在主要问题解决后,我愿意承担这个问题。

非常感谢!

标签: pythonregex

解决方案


推荐阅读