2014-06-19 45 views
0
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字母在括号中全部大写Python中提取包含括号每一句话

在:这里是(ABC)例如(AVCD)这一个

输出:这里是一个(ABC)的例子,包括这个(AB)和(AVCD)这个。

回答

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  

注意:你可以确定一个点代表句子的结尾,它可以是别的。

+0

,将工作,+1 :) – zx81

+0

我怎么会做这个,而是从文本文件中读取数据,而不是一个字符串?我一次循环一行的实现只返回第一行。 – mrobillard

+0

@mrobillard:你可以轻松做到。所有你需要的是在for循环之后(外部)存储一个变量,比如'subeol',结束行(从'offset'到end)。在for循环中,'result'现在是:'result + = subeol + txt [offset:m.end()]',并且在if语句后,必须将'subeol'初始化为一个空字符串。你只需要把所有的东西都放在线路循环中。 –

0

一点更高效的模式

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

Demo