Python中关于特定Cas的正则表达式

2024-05-28 19:08:35 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个最小的测试用例-

>>>import re  
>>>re.findall('(\w+\n?) ([^(!END)]+) (!END\n?)',"!MDCNTL\n  !GENERIC LUNIT=7.9406324338 LONGRANGE=F TRACE=F SCALE=1.0 !END\n  !RDYN DT=5. FRIC=0.001 NSTEP=20000 !END\n  !LATTICE t= 0.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0 0.0 !END\n !END")  
[('LATTICE', 't= 0.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0 0.0', '!END\n')]  

让我解释一下与xml非常相似的标记。
1.!TAG!END对应于xml中的<tag></tag>
2.键值对是key=value
3.值中允许空格

正则表达式应该挑选出最低级别的标记或叶子。我不明白为什么在这个特定的例子中只返回一片叶子。我构造的其他类似示例给出了预期的结果


Tags: 标记importretagtrace测试用例xmlgeneric
1条回答
网友
1楼 · 发布于 2024-05-28 19:08:35
>>> s = "!MDCNTL\n  !GENERIC .... "
>>> re.findall(r'(!(?!END)\w+)\s+(.*?)\s+(!END)', s, flags=re.DOTALL)
[('!MDCNTL', '!GENERIC LUNIT=7.9406324338 LONGRANGE=F TRACE=F SCALE=1.0', '!END'),
 ('!RDYN', 'DT=5. FRIC=0.001 NSTEP=20000', '!END'),
 ('!LATTICE', 't= 0.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0 0.0', '!END')]

使用re.DOTALL标志使.也匹配换行符

为什么问题中的正则表达式不起作用

[^(!END)]匹配不在(!END)中的字符([^.....]:负字符集)

GENERIC标签的属性中有E/NRDYN标签;这些阻碍了比赛

!GENERIC LUNIT=7.9406324338 LONGRANGE=F TRACE=F SCALE=1.0 !END
           ^                  ^   ^ ^       ^       ^
!RDYN DT=5. FRIC=0.001 NSTEP=20000 !END
                       ^  ^

相关问题 更多 >

    热门问题