2 回答

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超4個(gè)贊
當(dāng)涉及到輸入的這一部分時(shí):
2300 20 40\n 0000\n
它匹配如下:
(\d\d)(\d\d)
火柴2300
\s
匹配空間(\d\d)
火柴20
\s?
匹配空間(\d\d)?
火柴40
\s?
匹配換行符(\d\d)?
火柴00
\s?
不匹配,因?yàn)樗强蛇x的(\d\d)?
火柴00
\s? (\d\d)?
什么都不匹配,因?yàn)樗鼈兌际强蛇x的\n
匹配換行符
我懷疑您沒有意識(shí)到可以\s
匹配任何形式的空白,包括換行符。如果要在冗長(zhǎng)的正則表達(dá)式中按字面值匹配空格,請(qǐng)?jiān)诳崭袂凹由戏葱备?。所以大多?shù)\s?
應(yīng)該是\ ?
。

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超8個(gè)贊
原因是雙重的:
\s
匹配所有空格,換行符和空格;正如@WiktorStribi?ew已經(jīng)說過的,它也
\s?
匹配零個(gè)空格。
因此,發(fā)生的情況是您\s?
的其中一個(gè)在換行符后吃了換行符2300 20 40
,而下一個(gè)\s?
匹配了中間的缺失空格0000
。您看不到其他地方發(fā)生的問題,因?yàn)槟?code>\s?(\d\d)?了一個(gè)就可以覆蓋兩條實(shí)線。向正則表達(dá)式再添加一個(gè),您將看到以下行
2000 20 40\n
2100 20 40\n
內(nèi)爆了。
我不確定您要如何解析此文件,但要逐行從代碼中判斷。如果是這樣,則“顯式優(yōu)于隱式”:
time_regex = re.compile(r'^(\d{4})(\s\d{2})*$')
with open(...) as inf:
for line in inf:
m = time_regex.match(line)
# Use m.group(1) and m.group(2).split()
添加回答
舉報(bào)