python - Python中的正则表达式——关于一个具体案例

标签 python regex

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

>>>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 中的字符,ND)。 ([^.....]:负字符集)

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/

相关文章:

python - 几个大嵌套循环的小循环 vs 小嵌套循环的大循环性能?

python - scipy.signal.sepfir2d 中的类型错误

c# - 正则表达式提取链接

python - 从一行中删除所有逗号字符,除非行以 # 使用 python regex 开头

php - 在正则表达式中,当您向 .+ 添加问号时会发生什么变化

python - datetime.datetime.strptime() 使用可变输入长度

python - 如何强制和编辑 pyplot 子图的主要和次要日志图刻度

python - SQLalchemy 中的类没有名为 'x' 的映射列

regex - 用awk和regexp过滤列

javascript - 如何在文档中找到所有数字并设置它们的样式?