2011-09-27 186 views
1

我试图在Python中编写正则表达式来提取段落的一部分。正则表达式来提取段落

在下面的段落中,我希望提取的部分是粗体。

建议将提升救助资金,注入资金,银行和削减 希腊债务说报告。

我正则表达式和输出如下,

>>> text = 'Proposal will boost bailout fund, inject cash into banks and cut Greek debt says reports.' 
>>> pattern = re.compile(r'(boost bailout)+?([\s\S]*?)(debt)+?') 
>>> print re.findall(pattern, text) 

[('boost bailout', ' fund, inject cash into banks and cut Greek ', 'debt')] 

虽然它提取正确的部分,是不是该萃取被分离成3份在一个元组,而不是只是一个单一的线如下面?

[('boost bailout fund, inject cash into banks and cut Greek debt')] 

回答

1

从文档:

如果一个或多个组中存在的格局,回归团体名单;如果模式有多个组,这将是一个元组列表。空结果包含在结果中,除非他们触及另一场比赛的开始。

- http://docs.python.org/library/re.html

如果你想要一个比赛,做:

#!/usr/bin/env python 
import re 
text = 'Proposal will boost bailout fund, inject cash into banks and cut Greek debt says reports.' 
pattern = re.compile(r'boost bailout[\s\S]*?debt') 
print re.findall(pattern, text) 
+0

再次感谢!很多要学习,很多要学习。 :) – Ted

+0

不客气,再一次,特德! :) –

1

使用

re.search(reg, text).group(0) 

或(你的情况):

pattern.search(text).group(0) 
0

你的模式是不正确的:

(boost bailout)+意味着:字符串 '升压救助' 反复几次,
这当然不是想要的。如果你在模式中放置了几对,你会得到几个捕捉组。正确的模式,如果你想只提取“升压救助”和最后一个字符串之间的所有文字'debt'是:

pattern = r'boost bailout.+debt' 

和正则表达式是

reg = re.compile(r'boost bailout.+debt',re.DOTALL) 

re.DOTALL是使得点符号与每个字符匹配的标志,由换行符组成:它代替[\s\S]

但是如果你想“提升救助”和“债”的首次亮相之间提取,它必须是

pattern = r'boost bailout.+?debt' 

此外,使用reg.search(text).group()代替reg.findall(text)产生一个元素的列表。

注意图案通过pattern = r'boost bailout.+?debt'定义为字符串对象,
REG通过reg = re.compile(pattern)定义的一个RegexObject对象。

值得名字正则表达式是RegexObject,有什么值得名字模式是字符串。

0

您将返回一个元组,因为您可以在Python documentation for the re module中读取,括号会创建捕获组,然后可以单独检索它们。为了避免这种情况,您应该使用非捕获组:(?: ...)