2 回答
TA贡献1797条经验 获得超4个赞
当涉及到输入的这一部分时:
2300 20 40\n 0000\n
它匹配如下:
(\d\d)(\d\d)
火柴2300
\s
匹配空间(\d\d)
火柴20
\s?
匹配空间(\d\d)?
火柴40
\s?
匹配换行符(\d\d)?
火柴00
\s?
不匹配,因为它是可选的(\d\d)?
火柴00
\s? (\d\d)?
什么都不匹配,因为它们都是可选的\n
匹配换行符
我怀疑您没有意识到可以\s
匹配任何形式的空白,包括换行符。如果要在冗长的正则表达式中按字面值匹配空格,请在空格前加上反斜杠。所以大多数\s?
应该是\ ?
。
TA贡献1775条经验 获得超8个赞
原因是双重的:
\s
匹配所有空格,换行符和空格;正如@WiktorStribiżew已经说过的,它也
\s?
匹配零个空格。
因此,发生的情况是您\s?
的其中一个在换行符后吃了换行符2300 20 40
,而下一个\s?
匹配了中间的缺失空格0000
。您看不到其他地方发生的问题,因为您少\s?(\d\d)?
了一个就可以覆盖两条实线。向正则表达式再添加一个,您将看到以下行
2000 20 40\n
2100 20 40\n
内爆了。
我不确定您要如何解析此文件,但要逐行从代码中判断。如果是这样,则“显式优于隐式”:
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()
添加回答
举报