我试图在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')]
答案 0 :(得分:1)
使用
re.search(reg, text).group(0)
或(你的情况):
pattern.search(text).group(0)
答案 1 :(得分:1)
来自文档:
如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。结果中包含空匹配,除非它们触及另一场比赛的开头。
如果你想要一场比赛,请执行:
#!/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中阅读,括号中创建捕获组,然后可以单独检索它们。为了避免这种情况,您应该使用非捕获组:(?: ... )