這個問題在這里已經有了答案: Python 正則運算式模式 * 沒有按預期作業 2 個答案 17 小時前關閉。
當應用它們的字符之前沒有前面的字符時,您將如何證明 ?、{0、} 和 * 的行為,而不是空字串?
>>>re.search('b?','abc')
<re.Match object; span=(0, 0), match=''>
看起來它捕獲了一個索引為 0 的空字串,然后是 0 次出現的 'b' 并停在那里,甚至不用擔心字串的其余部分。在我看來,它并不那么貪婪。我希望它能夠捕捉到'b'。
另一方面,下一個作業正常:
>>>re.search('b?c','abc')
<re.Match object; span=(1, 3), match='bc'>
uj5u.com熱心網友回復:
>>> list(re.finditer('b?', 'abc'))
[<re.Match object; span=(0, 0), match=''>,
<re.Match object; span=(1, 2), match='b'>,
<re.Match object; span=(2, 2), match=''>,
<re.Match object; span=(3, 3), match=''>]
有多個匹配項b?,每個位置一個。re.search只回傳其中的第一個。它不回傳最長的,而是回傳第一個。'b'at position 1 確實是匹配,但是''位置 0 的匹配首先出現。
如果您不希望回傳空字串,我不會使用b?. 簡單的搜索b不會匹配空字串。
貪婪
當有多個匹配時,貪婪不會優先考慮更長的匹配。相反,它所做的是確定正則運算式引擎在進行匹配時是否會貪婪地吸收盡可能多的字符。例如,如果您使用b??非貪婪匹配,它會在位置 1 添加一個額外的空字串匹配:
>>> list(re.finditer('b??', 'abc'))
[<re.Match object; span=(0, 0), match=''>,
<re.Match object; span=(1, 1), match=''>,
<re.Match object; span=(1, 2), match='b'>,
<re.Match object; span=(2, 2), match=''>,
<re.Match object; span=(3, 3), match=''>]
一個經常出現的貪婪/非貪婪的更有用的例子是嘗試匹配打開和關閉分隔符。例如,假設您試圖將參考的對話框與".*":
>>> re.findall(r'".*"', '"My name is Bond," he said.')
['"My name is Bond,"']
看起來不錯。
>>> re.findall(r'".*"', '"My name is Bond," he said. "James Bond."')
['"My name is Bond," he said. "James Bond."']
哎呀。它并沒有停在第一個右引號。貪婪者.*繼續前進并消耗了額外的未參考和參考的文本。
如果我們讓它不貪心,".*?"那么它一看到收盤價就會停止匹配。它不允許.*匹配":
>>> re.findall(r'".*?"', '"My name is Bond," he said. "James Bond."')
['"My name is Bond,"', '"James Bond."']
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/485669.html
