从字符串中获取浮点数的Python正则表达式

4

我正在使用正则表达式从字符串中解析浮点数。

re.findall("[^a-zA-Z:][-+]?\d+[\.]?\d*", t)

这是我使用的代码。这段代码存在问题,如果数字与任何字符之间没有空格,它就无法解析该数字。例如,期望从“0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9”获得的输出应为[0,1,2,3,4,5,6,7,8,9],但它返回了“[|1,|2,|3,...]”。
有没有什么方法可以解决这种问题?

尝试使用 re.findall(r"[^a-zA-Z:]([-+]?\d*\.?\d+)", t) 或者尝试使用 re.findall(r"(?<![a-zA-Z:])[-+]?\d*\.?\d+", t) - Wiktor Stribiżew
为什么不使用更简单的 (\d+[.]?)+ 呢? - Dave Plug
@WiktorStribiżew 它是可以工作的,但不知何故会丢失第一个数字。如果 t 是 120,则返回 20。 - Bryan K.
你为什么使用了 [^a-zA-Z:] - Wiktor Stribiżew
@WiktorStribiżew 在字符串中,存在类似M1、M2的情况,我希望避免该案例中的数字。 - Bryan K.
@BryanK.:请查看 https://regex101.com/r/laApd1/1,它不会吞噬任何数字。尝试使用 re.findall(r"(?<![a-zA-Z:])[-+]?\d*\.?\d+", t),或者请提供失败的代码。 - Wiktor Stribiżew
2个回答

4

使用

re.findall(r"(?<![a-zA-Z:])[-+]?\d*\.?\d+", t)

请参考正则表达式演示
它会匹配不以字母或冒号开头的整数和浮点数。 详细信息
  • (?<![a-zA-Z:]) - 负向后瞻,确保当前位置前面没有紧跟着ASCII字母或冒号
  • [-+]? - 一个可选的+-
  • \d* - 零个或多个数字
  • \.? - 一个可选的小数点
  • \d+ - 一个或多个数字

谢谢,还有一个问题。在以下情况下“3monthSummary:month1:60.5 month2:60.24 month3:60.25”,它会将3解析为结果。有没有什么办法可以防止这种情况发生? - Bryan K.

1
在这里你应该能够做的最简单的事情就是将正则表达式中的“number”部分包装成一个捕获组,然后查看这些捕获组。
re.findall("[^a-zA-Z:]([-+]?\d+[\.]?\d*)", t)

我刚刚在你的搜索中,在“number”部分周围添加了括号。


谢谢。它是有效的,但是不知何故丢失了第一个数字。从这个例子来看,它返回[1,2,3,4,5,6,7,8,9]。 - Bryan K.
是的,这里的问题在于你强制匹配的第一个字符必须是非字母非冒号,而字符串中的第一个数字前面没有任何东西。你可以在该块中添加一个?,但这可能会导致其他奇怪的行为。我认为你需要提供更多的样本来说明你想要发生什么,以便得到准确的正则表达式。这是修改后的正则表达式:[^a-zA-Z:]?([-+]?\d+[\.]?\d*) - Shawn Tabrizi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接