这是一个最小的测试用例 -
>>>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
对应<tag>
和</tag>
在 XML 中
2.键值对为key=value
3. 值中允许有空格
正则表达式应该挑选出最低级别的标签或叶子。我不明白为什么这个具体示例只返回其中一片叶子。我构建的其他类似示例给出了预期结果。
最佳答案
>>> 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)]
匹配不在 (
, !
, E
中的字符,N
,D
,)
。 ([^.....]
:负字符集)
GENERIC
标签、RDYN
标签的属性中有E
/N
;这些会阻止匹配。
!GENERIC LUNIT=7.9406324338 LONGRANGE=F TRACE=F SCALE=1.0 !END
^ ^ ^ ^ ^ ^
!RDYN DT=5. FRIC=0.001 NSTEP=20000 !END
^ ^
关于python - Python中的正则表达式——关于一个具体案例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21966988/