Regex 正则表达式以筛选出具有特定模式的字符串

Regex 正则表达式以筛选出具有特定模式的字符串,regex,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 par

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

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”的内容。在这上面花了几个小时之后,现在我快疯了。有人能帮我吗?

*
是贪婪的,它会尝试尽可能多的匹配,即超过第一个单词,这可能是您发现意外结果的主要原因。首先,您可以通过添加问号(例如,
*?
)使其不贪婪

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

^[^\s]+
开头的
^
称为锚点,并断言匹配从字符串(或多行模式下的行)的开头开始

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

^[^\s]+\s+(.*?)\d+\.\d\d
在某些情况下,上述情况可能会出现问题,可能有点太复杂,无法以您目前的水平进行解释。但是,如果您知道您的语言或实现支持前瞻断言,那么这将更加健壮:

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

它所做的是匹配每个字符
,只要它后面没有浮点数(这就是所谓的负前瞻断言)。

非常感谢你救了我的命,这工作非常好。你对在哪里学习正则表达式有什么建议吗?谢谢你对第二个的解释。虽然这对我来说很复杂,但还是很有帮助的。很高兴能帮上忙。网上有很多教程,其中似乎很流行。但坦率地说,我只知道我从多年的经验(有时是不必要的经验!)中知道的,特别是从闲逛和回答正则表达式问题中知道的。(正如人们所说,没有比教书更好的老师了。)尽管如此,还是可以随时过来寻求指导;这里的大多数人都乐于根据您需要的范围进行解释和教学。(只要你不去问关于正则表达式的HTML,在这种情况下,人们会咬你的头。)此外,你可以查看以下内容:。你输入你的正则表达式和测试数据,它会绘制一个图表,可能有助于澄清你在构建什么。谢谢你的建议!:)