猿问

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

我做了一个正则表达式,应该能够从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”,请帮忙。


牧羊人nacy
浏览 172回答 2
2回答

繁星coding

当涉及到输入的这一部分时: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?应该是\ ?。

www说

原因是双重的:\s 匹配所有空格,换行符和空格;正如@WiktorStribiżew已经说过的,它也\s?匹配零个空格。因此,发生的情况是您\s?的其中一个在换行符后吃了换行符2300 20 40,而下一个\s?匹配了中间的缺失空格0000。您看不到其他地方发生的问题,因为您少\s?(\d\d)?了一个就可以覆盖两条实线。向正则表达式再添加一个,您将看到以下行2000 20 40\n2100 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()
随时随地看视频慕课网APP

相关分类

Python
我要回答