我是初学python程序员。我正在尝试使用正则表达式来构建要附加到列表的组。我不确定我想要做什么可以用一个正则表达式覆盖,或者我是否需要通过多个正则表达式传递文本。
测试数据:
yada yada 0.003 40 40.00
yadayada ya 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 *)组的末尾,但得到相同的空组。
答案 0 :(得分:1)
执行你通俗地描述为“正确对齐”比赛的最简单方法,i。即优先考虑后续可选子表达式的匹配,是为了扭转可选组件的“贪婪”。在Python正则表达式中,这是通过向每个量化元素添加?
来实现的:
(\w+ *\w* *\w*) (\d*?\.*?\d*?) *?(\d*?\.*?\d*?) *?(\d*?\.*?\d*?)\n
请注意,您的表达式非常宽松,不会验证某些格式错误的输入。如果这对您有用,那么您可能需要考虑将某些部分粘贴在可选组中,例如(| \d+(?:\.\d+)?)
以延迟匹配空格和数字(例如,构造(|x)
等同于{ {1}})。
((?:x)??)
它仍然可以匹配格式错误的输入,但至少它现在有点紧张。
答案 1 :(得分:0)
你的正则表达式有几个问题,其中一个是catastrophic backtracking的高风险,因为正则表达式引擎需要在非匹配情况下测试的排列数量呈指数增长。另一个有问题的是\w
也会匹配数字,因此第一组可能包含您不希望它包含的数字。
此外,对于这种“动态增长”的正则表达式,您需要一个“匹配延续”功能,如\G
或\K
锚点,但Python不支持这些。
最好的方法是将.split()
字符串转换为子字符串,然后检查每个子字符串是否包含数字(例如通过try
将其转换为float
)和表现得相应。
添加了奖励:你有一个可读的Python脚本,而不是一个非常复杂的正则表达式。