Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正则表达式不会分隔最后一个字符串_Python_Regex - Fatal编程技术网

Python 正则表达式不会分隔最后一个字符串

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) (\

我制作了一个正则表达式,它应该能够从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)
(\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
    匹配所有空格、换行符和空格
  • 正如@WiktorStribiżew已经说过的,
    \s?
    也匹配零空格
  • <> P> >您的<代码> >代码> >在代码> > 2300 20 40 之后,使用换行符,下一个<代码> s >代码>匹配<代码> 0000 中间的空白空白。你看不到问题发生在其他地方,因为你少了一个
    \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()