正则表达式提取段落

时间:2011-09-27 12:26:23

标签: python regex

我试图在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')]

4 个答案:

答案 0 :(得分:1)

使用

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

或(你的情况):

pattern.search(text).group(0)

答案 1 :(得分: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)

答案 2 :(得分:0)

您的模式不正确:

(boost bailout)+表示:字符串'boost bailout'重复多次,
这肯定不是想要的。如果你在模式中放入几对parens,你将获得几个捕获组。如果您只想提取“提升救助”和最后一个字符串'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 = re.compile(pattern)定义的 reg 是RegexObject对象。

值得名称​​ regex 的是RegexObject,值得命名的是 pattern 是字符串。

答案 3 :(得分:0)

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

相关问题