regex .findall()不会返回所有匹配项

时间:2014-10-13 02:33:42

标签: python-2.7

我试图找到关键字并选择关键字周围的句子。输入文本(例如)如下。为解释目的,我将关键字设为粗体:

  

董事会已采纳“公司治理指引”,其副本可于我们的互联网网站www.henryschein.com下载,公司信息 - 公司治理标题下。我们的公司治理指南涉及以下主题:(i)董事会的角色,(ix)管理发展和继任计划,(xiv)提交董事辞职和(xv)与董事会沟通董事。

     

除其他事项外,本公司的企业管治指引规定,董事会的政策是定期检讨与首席执行官的选择及表现有关的事宜。至少每年一次,首席执行官必须向董事会报告公司的管理发展计划和继任计划。此外,董事会和首席执行官应定期讨论首席执行官在首席执行官突然辞职,退休或残疾时对继任者的建议。

我使用的代码如下:

def find_sentences(text):
    p = re.compile(r'[^\.]*\.[^\.]*succession-planning[^\.]*\.[^\.]*\.')
    p2 = re.findall(p,text)

    if len(p2)>1:
        p3 = '######################################'.join(i for i in p2)
    else:
        p3 = p2[0]
    return p3

text2 = re.sub(r'succession planning[^\s^\w+]+','succession-planning', text)
sentence=find_sentences(text2)

输出如下:

  

董事会已采纳“公司治理指引”,其副本可于我们的互联网网站www.henryschein.com下载,公司信息 - 公司治理标题下。我们的公司治理指南涉及以下主题:(i)董事会的角色,(ix)管理发展和继任计划,(xiv)提交董事辞职和(xv)与董事会沟通董事。

     

除其他事项外,本公司的企业管治指引规定,董事会的政策是定期检讨与首席执行官的选择及表现有关的事宜。

问题问题是当我打印上面的 p2 时,它只返回围绕并包括第一个继承计划的句子。它不会返回该关键字的第二次出现。除了上面的输出之外,我还需要一个代码来返回以下内容:

  

除其他事项外,本公司的企业管治指引规定,董事会的政策是定期检讨与首席执行官的选择及表现有关的事宜。至少每年一次,首席执行官必须向董事会报告公司的管理发展计划和继任计划。此外,董事会和首席执行官应定期讨论首席执行官在首席执行官突然辞职,退休或残疾时对继任者的建议。

当我使用p更改 p = re.compile(r'[^\.]*succession-planning[^\.]*\.') 时,它会返回两次发生,但不包括周围的句子。我认为findall不会返回重叠的匹配。我怎样才能让他们归还?

1 个答案:

答案 0 :(得分:1)

答案:.findall() 方法会返回所有匹配项。

.findall()方法无法在文字上返回任何匹配项,其中不包含设计的词组 - 段(没有此类子字符串==" 继任计划")

p = re.compile(r'[^\.]*\.[^\.]*succession-planning[^\.]*\.[^\.]*\.')

是的,有几乎相似的"细分,但没有" - "

简历:正则表达式不应该归咎于找不到根本不存在的文本片段。


第二个"继承计划" - 关键字包含(或不包含)依赖于re.findall()方法,但 依赖于“任务定义”要求的严格性,该要求指出" 围绕关键字"。

弱解释可能包含一个案例,关键字的右侧不是" 包围"通过任何句子延续词,但以一个停止标志终止。

强有力的解释会限制关键字两边未能包围的情况。

>>> mStrg = re.compile( r'....succession planning[^\.]+?\.[^\.]*?\.' )
>>> mWeak = re.compile( r'....succession planning[^\.]*?\.' )
>>> re.findall( mWeak, text )
[ "...", "...for management development and on succession planning."]
>>> len( re.findall( mWeak, text ) )
2