我想识别一个字符串,例如:
a = 'KI83949 anythingHere 900.00 1 900.00'
该字符串由三部分组成:
index part is the string before the first space
- 'KI83949'
可以是任何东西,在大多数情况下,它是字符+数字。
string between a[0] and the first floating number
with two decimal points is the seconde part
-'anything here'
可以是任何东西
starting with the 2-decimal-point floating number is the last part
-'900.00 1 900.00'
可以是
'900.00' or '900.00 1 1003.00' or '900.00 100.00'
float or float+int+float or float+float
这里的数字会改变。对于整个字符串,数字部分始终存在,而前两个部分可能不存在。我试图从数以千计的其他字符串中过滤出具有上述功能的字符串。我已经尝试了几种表达方式,但仍然失败了。抱歉我的正则表达能力差。最近的镜头如下:
'.*\s?[\d.]+(\s\d)?[\s\d.]+$'
然而,它会返回类似'TS90190'或'80 thda 4318'的内容。花了好几个小时后,现在它让我发疯了。有人可以帮我吗?
答案 0 :(得分:2)
.*
贪婪 -it将尝试尽可能多地匹配 ,即比第一个词更多可能是您发现意外结果的主要原因。首先,您可以通过添加问号例如 .*?
来制作非贪婪。
但是,更严格的方法是仅匹配非空格字符开始:
^[^\s]+
开头的^
称为锚,并声明匹配从字符串的开头(或多行模式<行开始) / em>的)。
让我们看看下一步是什么。你想要匹配最多第一个浮动,对吧?听起来我们需要某种非贪婪的量词!
^[^\s]+\s+(.*?)\d+\.\d\d
以上情况可能会在某些情况下出现问题,可能有点太复杂,无法在您的级别解释。如果您知道您的语言或实现支持先行断言,那么这将更加强大:
^[^\s]+\s+(.(?!\d+\.\d\d))+
这个正在做的是它匹配每个字符.
,只要它的没有跟着(那个被称为负向前瞻的部分)断言)浮动。