如何检查整个输入字符串(用空格分隔的实数)是否与Python中的正则表达式匹配?

如何检查整个输入字符串(用空格分隔的实数)是否与Python中的正则表达式匹配?,python,regex,Python,Regex,我有一个输入字符串,由一个空格分隔的实数序列组成。字符串仅包含一个实数(无空格)也是可以接受的。我的目标是检查字符串结构是否匹配以下内容(按此顺序): 可选(0/1):减(-) 1/多个数字 可选(1+):一个句点和一个或多个数字 可选(0+):由空格和第一组(前三个项目符号)组成的组 它应该完整地描述字符串。如果没有,则应打印错误消息并退出。 我当前的正则表达式是^(-d+(\.?\d)*)(\1)*$,我认为这是可以的,但即使是第一组也不能单独匹配所有实数。我需要它从头到尾检查字符串,包

我有一个输入字符串,由一个空格分隔的实数序列组成。字符串仅包含一个实数(无空格)也是可以接受的。我的目标是检查字符串结构是否匹配以下内容(按此顺序):

  • 可选(0/1):减(-)
  • 1/多个数字
  • 可选(1+):一个句点和一个或多个数字
  • 可选(0+):由空格和第一组(前三个项目符号)组成的组
它应该完整地描述字符串。如果没有,则应打印错误消息并退出。
我当前的正则表达式是
^(-d+(\.?\d)*)(\1)*$
,我认为这是可以的,但即使是第一组也不能单独匹配所有实数。我需要它从头到尾检查字符串,包括空格

此函数的代码如下所示:

import re
def structure_check(string):
    structure = r"^(-?\d+(\.?\d)*)( \1)*$"
    if re.match(structure,string):
        return("OK")
    else:
        print("Input error")
        exit()
它应该接受如下字符串:
15 35-45 8-2.3 4564.18 56
等,但它根本不对应输入中的更改(不匹配)。如果空格太多,位置不正确,或者除了数字、句点、破折号(
-
)和空格之外还有其他字符,则不应匹配

我也可以在遍历通过按空格拆分输入字符串创建的列表时仅使用第一个组来执行此操作,但我更愿意根据我的主要目标进行检查,因为我不必在验证函数中拆分输入,也不必通过一起检查输入来保存更多的代码行(例如,对于多余的空格或不支持的字符,我必须单独检查)


很抱歉,如果我遗漏了任何已回答的问题,我无法找到任何适合我在Python中遇到的问题的答案。如果你知道任何问题,请随意链接它们。谢谢你,我是一名初学者,昨天刚开始为一个项目学习正则表达式。

在JavaScript中,你可以使用regex的方法。测试regex。正则表达式应该在Python中工作

let ok=/^([+\-]?\d+(\.\d+)(\.$)+$/.test(“15 35-45 8-2.3 4564.18 56”);
console.log(确定);
您可以使用:

^((?:[+-]?\d+(?:[.]\d+)?)(?:[ \t]|$))*$ 


我在可选符号中添加了
+
。如果您只想匹配无符号或
-
,只需将其从可选字符类中删除。

问题在于您的regexp,具体而言,在
(\1)*
部分。 这表示:在第1组中匹配零次或多次的空格和字符串 因此,您的regexp将匹配以下内容,例如:
15

-5.3-5.3-5.3-5.3-5.3

等等

为了修复regexp,我将用实际的组替换组引用,如下所示:
^(-d+(\.?\d)*)(\d+(\.?\d)*)*$


我还想指出,这个regexp允许数字有多个小数点(例如,
1.2.3
过程),但是我不确定这是否是有意的。

您也可以使用展开版本来防止匹配末尾的空格

^-?\d+(?:\.\d+)?(?: -?\d+(?:\.\d+)?)*$


反向参考
\1
将与组1中匹配的内容完全匹配,并且对于您的模式,将匹配例如
123

如果要重复该组,可以使用
PyPi regex模块和
(?1)


请参见a

定义过多的空格?@dawg表示两个或多个空格(我需要这一点以便将来拆分时保持一致)。更广泛的正则表达式可能还会过滤掉冗余的空格在字符串的末尾。@Ad.H.Jes.您是否打算重用regex模式的一部分?@第四只鸟是的,是的,作为一种可能性,但不一定。由于我的模式没有那么长,我没有问题重复它,只是认为它将是一个更优雅的解决方案。主要目标是检查整个输入字符串的严格结构。Thanks,我没有注意到多个小数点的问题,我想将组后面的
*
s替换为
s可以解决这个问题:
^(-d+(\.?\d))(\d+(\.?\d)?)*$
你的答案对我帮助很大,因为我是初学者。我还发现了另一个错误-正则表达式只匹配小数点后一位数字。我在
\d
后添加了
+
,如果需要(2x)。
^(-\d+(\.?\d+)(-\d+(\.?\d+)*$
最后一次编辑:我去掉了0/1规则(
)对于小数点。
^(-\d+(\.\d+))(-\d+(\.\d+))*$
^(-?\d+(?:\.\d+)?)(?: (?1))*$