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个字母,括号中的所有大写)。
以下是一个(ABC)例子。不包括这句话。包括这个(AB)一个。还有(AVCD)这个。
输出:这里是一个(ABC)例子。包括这个(AB)一个。还有(AVCD)这个。
发布于 2014-06-19 04:34:03
你可以用这个:
[^.]*?\([A-Z]{2,4}\)[^.]*\.但是请注意,这是一种特别低效的方法,因为模式从一个非常宽松的子模式开始。您可以通过在开始时添加一种锚来纠正这一点:
(?:(?<=.)|^)[^.]*?\([A-Z]{2,4}\)[^.]*\.不幸的是,即使有了这个锚,regex引擎也必须检查字符串中大多数字符的两个选项。
一种更好的方法可能是找到以首字母缩写开头的子字符串,直到句子和点的结尾,然后使用每个结果的末尾偏移量来提取子字符串:
#!/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 注意:你可以确定一个圆点代表一个句子的结尾,它可以是其他的东西。
发布于 2014-06-19 04:48:43
一个更有效的模式
([^.(]++\([^.)]++\)[^.)]++\.)演示
https://stackoverflow.com/questions/24298809
复制相似问题