我是一个初级的python程序员。我尝试使用正则表达式来构建组以附加到列表。我不确定我要做的是用一个正则表达式覆盖,还是需要通过多个正则表达式传递文本。在
试验数据:
雅达雅达0.003 40 40.00
耶大田雅55
yaaaaaaya 100.0000 4号
我的正则表达式:
(\w+ *\w* *\w*) (\d*\.*\d*) *(\d*\.*\d*) *(\d*\.*\d*)\n
我得到的组:
'yada-yada'、'0.003'、'40'、'40.00'
'yadayada-ya','55',空,空
'yaaaaaaya','100.0000','4',空
但我想要的是:
'yada-yada'、'0.003'、'40'、'40.00'
'yadayada ya',空的,空的,'55'
'yaaaaaaya',空,'100.0000','4'
是否可以更改正则表达式,将空(\d*.*\d*)组引入到那些组中少于3个的行中?所以数字组是“正确的”吗?在
我想补充一下?到前两个(\d*)组的末尾,但得到相同的空组。在
最简单的方法来执行你所说的“正确证明”匹配,即优先匹配后面的可选子表达式,是反转可选组件的“贪婪”。在Python regex中,这是通过向每个量化元素添加
?
来实现的:请注意,您的表达式非常自由,不会验证某些格式不正确的输入。如果这对您有效,那太好了,否则您可能需要考虑将某些部分粘贴到可选组中,例如
(| \d+(?:\.\d+)?)
来延迟地匹配一个空格和数字(例如,(|x)
相当于((?:x)??)
)。在编辑:正如Tim所指出的,这个正则表达式的缺点不仅仅是允许性,而且如果输入的格式稍有错误,可能会引发灾难性的回溯。如果你打算坚持这种方法,我推荐一些更精确的方法:
^{pr2}$它仍然可以匹配格式错误的输入,但至少现在有点紧了。在
您的正则表达式有几个问题,其中之一是catastrophic backtracking的高风险,因为正则表达式引擎需要在不匹配的情况下测试的置换数量呈指数级增长。另一个问题是
\w
也将匹配数字,因此第一个组可能包含您不希望它包含的数字。在此外,对于这样一个“动态增长”的regex,您需要一个“match continuation”特性,比如}锚点,但是Python不支持这些特性。在
\G
或{最好的方法是
.split()
将字符串转换成子字符串,然后检查每个子字符串是否包含数字(例如,try
ing将其转换为float
),并相应地执行相应的操作。在额外的好处是:您有一个可读的Python脚本,而不是一个非常复杂的regex。在
相关问题 更多 >
编程相关推荐