[英]Python regex non-greedy acting like greedy
我正在處理成績單,並且在以非貪婪的方式匹配模式方面遇到困難。 它仍然抓得太多,看起來像在做貪婪的比賽。
成績單如下:
>> John doe:您好,我是John Doe。
>>你好,我是Jane Doe。
>>感謝您的光臨,我們將在兩分鍾后開始。
>> Sam Smith:[沒有音頻]大家早上好。
為了在>>(WHATEVER NAME)中找到發言者的名字:,我寫道
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'
'Hello, I am Jane Doe. >> Thank you for coming, we will start in two minutes. >> Sam Smith'
我很困惑因為.*?
是非貪婪的,我認為應該能夠抓住'Sam Smith'
。 我應該如何修復代碼,以便它只能抓取>>(WHATEVER NAME)中的任何內容:? 另外,我使用的是Python 3.6。
謝謝!
你真的需要正則表達式嗎? 您可以拆分>>
提示,然后過濾掉您的名字。
>>> [i.split(':')[0].strip() for i in transcript.split('>>') if ':' in i]
['John doe', 'Sam Smith']
你對非貪婪正則表達式的理解略有不同。 非貪婪意味着它將匹配從開始匹配時可能的最短匹配。 如果在匹配中找到另一個角色,它將不會更改它開始匹配的角色。
例如:
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']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.