Python提取包含括号的每个句子

时间:2014-06-19 04:30:38

标签: regex file-io

with open(searchfile) as f:

pattern = "\.?(?P<sentence>.*?\(([A-Za-z0-9_]+)\).*?)\."
for line in f:
    match = re.search(pattern, line)
    if match != None:
        print match.group("sentence")

我试图在括号中提取包含首字母缩略词的每个句子(在括号中基本上是2-4个字母的全部大写。

In:这是一个(ABC)示例。不要包含这句话。包括这个(AB)一个。和(AVCD)这一个。

Out:这是一个(ABC)示例。包括这个(AB)一个。和(AVCD)这一个。

2 个答案:

答案 0 :(得分:1)

您可以使用:

[^.]*?\([A-Z]{2,4}\)[^.]*\.

但请注意,这是一种特别低效的方式,因为模式以非常宽松的子模式开始。您可以通过在开头添加一种锚来纠正这一点:

(?:(?<=.)|^)[^.]*?\([A-Z]{2,4}\)[^.]*\.

不幸的是,即使使用此锚点,正则表达式引擎也必须检查字符串大部分字符的两个备选方案。

更好的方法可能是找到从首字母缩略词开始直到句子结尾和点的子串,然后使用每个结果的结束偏移量提取子串:

#!/usr/bin/python

import re

txt = 'Here is an (ABC) example. Do not include this sentence. Include this (AB) one. And (AVCD) this one.'

pattern = re.compile(r'([!.?])(?=\s)|\([A-Z]{2,4}\)[^.]*(?:\.|$)')
offset = 0
result = ''
for m in pattern.finditer(txt):
    if (m.group(1)==None):
        result += txt[offset:m.end()]
    offset = m.end()

print result     

注意:您可以确定一个点代表一个句子的结尾,它可能是其他的。

答案 1 :(得分:0)

更有效的模式

([^.(]++\([^.)]++\)[^.)]++\.)

Demo