我正在处理成绩单,并且无法以非贪婪的方式匹配模式。它仍然抓得太多,看起来像在做贪婪的比赛。
成绩单如下:
>> 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。
谢谢!
答案 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']