Python 正则表达式不会分隔最后一个字符串
我制作了一个正则表达式,它应该能够从html文件中分离出特定的数字顺序,但在最后一部分它根本不起作用。这就是html文件的打印方式:Python 正则表达式不会分隔最后一个字符串,python,regex,Python,Regex,我制作了一个正则表达式,它应该能够从html文件中分离出特定的数字顺序,但在最后一部分它根本不起作用。这就是html文件的打印方式: 0430\n 0500 20 40 53\n 0606 19 32 45 58\n 0711 22 33 44 55 \n ... 2000 20 40\n 2100 20 40\n 2200 20 40\n 2300 20 40\n 0000\n \n 这是我的正则表达式: timeRegex = re.compile(r'''((\d\d)(\d\d) (\
0430\n
0500 20 40 53\n
0606 19 32 45 58\n
0711 22 33 44 55 \n
...
2000 20 40\n
2100 20 40\n
2200 20 40\n
2300 20 40\n
0000\n
\n
这是我的正则表达式:
timeRegex = re.compile(r'''((\d\d)(\d\d)
(\n|(\s
(\d\d)
\s?
(\d\d)?
\s?
(\d\d)?
\s?
(\d\d)?
\s?
(\d\d)?
)\n)?
)''',re.VERBOSE|re.DOTALL)
当查看列表时,它在大多数情况下工作正常,直到列表中的最后一个元素拾取0000,因此它看起来像是“2300 20 40\n0000\n\n”
请提供帮助。当它到达输入的这一部分时:
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
匹配任何类型的空格,包括换行符。如果要在详细的regexp中逐字匹配空格,请在空格前面写一个反斜杠。因此,大多数\s?
应该是\?
原因有两个:
\s
匹配所有空格、换行符和空格李>
\s?
也匹配零空格\s?(\d\d)?
来覆盖两整行;在正则表达式中再添加一个,您将看到行
2000 20 40\n
2100 20 40\n
也内爆了
我不知道你想如何解析这个文件,但从你的代码行逐行判断。如果是的话,“:
您是否在问为什么
0000
匹配?您的\s?
匹配1或0个空格。@WiktorStribiżew我不明白为什么“2300 20 40\n0000\n\n”是列表中的最后一个元素,而不仅仅是“0000\n”,我不确定我做错了什么,因为这在列表中的其他任何地方都不会发生。您的文件中有文字\n
?我正在试图理解为什么在换行之前显示\n
。您是否尝试将其放入regex101.com?它显示所有捕获组如何与颜色代码匹配。为什么使用re.DOTALL
?你不是在一行一行地解析文件吗?谢谢,巴德,这很有效,我不知道所有这些
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()