为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

牧羊人nacy 2021-05-06 10:11:16
我做了一个正则表达式,应该能够从html文件中分离出数字的特定顺序,但是在最后一部分中它不起作用。因此,这是html文件打印出来的方式:0430\n0500 20 40 53\n0606 19 32 45 58\n0711 22 33 44 55 \n...2000 20 40\n2100 20 40\n2200 20 40\n2300 20 40\n0000\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”,请帮忙。
查看完整描述

2 回答

?
繁星coding

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?应该是\ ?


查看完整回答
反对 回复 2021-05-11
?
www说

TA贡献1775条经验 获得超8个赞

原因是双重的:

  1. \s 匹配所有空格,换行符和空格;

  2. 正如@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()


查看完整回答
反对 回复 2021-05-11
  • 2 回答
  • 0 关注
  • 171 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信