对正则表达式功能的澄清/ .findall()返回不在捕获组中的匹配项

时间:2019-02-25 17:40:05

标签: python regex

似乎我不能全神贯注于正则表达式。

我的字符串:

<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标签之后的多行内容匹配,但这是我在主要问题解决之后愿意承担的一个问题。

非常感谢!

0 个答案:

没有答案