簡體   English   中英

Python正則表達式非貪婪表現得像貪婪

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM