提取字符串中被空白包围的浮点数



我有类似于这个例子的字符串:

str = '     area                                AMW1  =     93.3 m2 ';

我只想提取浮点数(可能带有符号"-")93.3。我想提取的浮点数总是被空白包围。

我该怎么做呢?

我试着

s = regexp(str,'d+.?d*','match')

然而,它也匹配12。我发现的其他各种表达式也不起作用……

谢谢。

可以使用

regexp(str,'-?d+.d+','match')

或者,如果您还需要匹配+:

regexp(str,'[-+]?d+.d+','match')

如果只需要在空白边界内匹配:

regexp(str,'(?<!S)[-+]?d+.d+(?!S)','match')

如果float值必须在两个空白字符之间:

regexp(str,'(?<=s)[-+]?d+.d+(?=s)','match')

细节

  • (?<=s)-在匹配之前,必须有一个空格
  • (?<!S)-在匹配之前,必须有字符串的开始,或空白
  • [-+]?-可选+-
  • d+-一个或多个数字
  • .- a点
  • d+-一个或多个数字
  • (?!S)-在后面,必须有字符串的结尾或空白
  • (?=s)-匹配后必须有一个空格。

如果您需要查找整数或浮点数,则将d+.d+替换为d+(?:.d+)?

try this:

re.compile(r'(?<=s)d+(.d+)?(?=s)')

您在问题中没有提到是否/为什么需要使用regexp。如果字符串组成具有一致的模式,则可以使用sscanftextscan来抓取所有非空白元素,而不是使用regexp

>> str = '     area                                AMW1  =     93.3 m2 '
str =      area                                AMW1  =     93.3 m2

使用sscanf读取可预测的格式化字符串:

>> sscanf(str, " %s %s %s %f %s ")
ans =
97.000
114.000
101.000
97.000
65.000
77.000
87.000
49.000
61.000
93.300
109.000
50.000

(对于混合类型,字符以其数值/ascii值存储在数值数组中)

使用*忽略不需要的元素

> sscanf(str, " %*s %*s %*s %f %*s ")
ans = 93.300

也适用于否定:

>> str = '     area                                AMW1  =     -93.3 m2 '
str =      area                                AMW1  =     -93.3 m2
>> sscanf(str, " %*s %*s %*s %f %*s ")
ans = -93.300

类似地使用textscan,它将输出存储在单元格数组中:

>> textscan(str, " %s %s %s %f %s ")
ans =
{
[1,1] =
{
[1,1] = area
}
[1,2] =
{
[1,1] = AMW1
}
[1,3] =
{
[1,1] = =
}
[1,4] = -93.300
[1,5] =
{
[1,1] = m2
}
}
>> textscan(str, " %*s %*s %*s %f %*s ")
ans =
{
[1,1] = -93.300
}
>> cell2mat(textscan(s, " %*s %*s %*s %f %*s "))
ans = -93.300

最新更新