正则表达式过滤掉具有特定模式的字符串

时间:2013-10-24 06:08:40

标签: regex

我想识别一个字符串,例如:

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'的内容。花了好几个小时后,现在它让我发疯了。有人可以帮我吗?

1 个答案:

答案 0 :(得分:2)

.* 贪婪 -it将尝试尽可能多地匹配 比第一个词更多可能是您发现意外结果的主要原因。首先,您可以通过添加问号例如 .*?来制作非贪婪

但是,更严格的方法是仅匹配非空格字符开始:

^[^\s]+

开头的^称为,并声明匹配从字符串的开头(或多行模式<行开始) / em>的)。

让我们看看下一步是什么。你想要匹配最多第一个浮动,对吧?听起来我们需要某种非贪婪的量词

^[^\s]+\s+(.*?)\d+\.\d\d

以上情况可能会在某些情况下出现问题,可能有点太复杂,无法在您的级别解释。如果您知道您的语言或实现支持先行断言,那么这将更加强大:

^[^\s]+\s+(.(?!\d+\.\d\d))+

这个正在做的是它匹配每个字符.,只要它的没有跟着(那个被称为负向前瞻的部分)断言)浮动。