Python正则表达式非贪婪表现得像贪婪

时间:2018-05-02 03:38:35

标签: python regex python-3.x regex-greedy non-greedy

我正在处理成绩单,并且无法以非贪婪的方式匹配模式。它仍然抓得太多,看起来像在做贪婪的比赛。

成绩单如下:

>> John doe:您好,我是John Doe。

>>你好,我是Jane Doe。

>>感谢您的光临,我们将在两分钟后开始。

>> Sam Smith:[没有音频]大家早上好。

在>>范围内查找发言人姓名(无论名称):,我写了

pattern=re.compile(r'>>(.*?):')
transcript='>> John doe: Hello, I am John Doe. >> Hello, I am Jane Doe. >> Thank you for coming, we will start in two minutes. >> Sam Smith: [no audio] Good morning, everyone.'
re.findall(pattern, transcript)

我期待'John Doe''Sam Smith',但它正在给我'John Doe''Hello, I am Jane Doe. >> Thank you for coming, we will start in two minutes. >> Sam Smith'

我很困惑,因为.*?非贪婪,(我认为)应该能够抓住'Sam Smith'。我该如何修复代码,以便它只能抓取任何内容 >> (无论名称):?另外,我使用的是Python 3.6。

谢谢!

2 个答案:

答案 0 :(得分:4)

你真的需要正则表达式吗?您可以拆分>>提示,然后过滤掉您的姓名。

>>> [i.split(':')[0].strip() for i in transcript.split('>>') if ':' in i]
['John doe', 'Sam Smith']

答案 1 :(得分:2)

你对非贪婪的正则表达式的理解略有不同。非贪婪意味着它将匹配从开始匹配时可能的最短匹配。如果在匹配中找到另一个角色,它不会改变它开始匹配的角色。

例如:

start.*?stop

将匹配所有startstartstop,因为一旦它在start开始匹配,它将保持匹配,直到找到停止。非贪婪只是意味着对于字符串startstartstopstop,它只会匹配到第一站。

对于您的问题,使用积极的前瞻来解决这个问题很简单。

您可以使用>> ([a-zA-Z ]+)(?=:)

>>> transcript='>> John doe: Hello, I am John Doe. >> Hello, I am Jane Doe. >> Thank you for coming, we will start in two minutes. >> Sam Smith: [no audio] Good morning, everyone.'    
>>> re.findall(r'>> ([a-zA-Z ]+)(?=:)', transcript)
['John doe', 'Sam Smith']
相关问题