我有类似于这个例子的字符串:
str = ' area AMW1 = 93.3 m2 ';
我只想提取浮点数(可能带有符号"-")93.3
。我想提取的浮点数总是被空白包围。
我该怎么做呢?
我试着
s = regexp(str,'d+.?d*','match')
然而,它也匹配1
和2
。我发现的其他各种表达式也不起作用……
谢谢。
可以使用
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
。如果字符串组成具有一致的模式,则可以使用sscanf
或textscan
来抓取所有非空白元素,而不是使用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