Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python将实数/浮点数与正则表达式匹配_Python_Regex - Fatal编程技术网

Python将实数/浮点数与正则表达式匹配

Python将实数/浮点数与正则表达式匹配,python,regex,Python,Regex,我不是最擅长复古的 有人能告诉我,在出现文字“each”之前,这个模式是否可以返回一个整数或十进制数的单个匹配项?数字和字符串将用单个空格分隔 for each in parsed: if measure_string.find(each)>-1: r = re.compile("([0-9]\.?[0-9]?) "+each) b = re.match(r,measure_string)

我不是最擅长复古的

有人能告诉我,在出现文字“each”之前,这个模式是否可以返回一个整数或十进制数的单个匹配项?数字和字符串将用单个空格分隔

for each in parsed:
            if measure_string.find(each)>-1:
                r = re.compile("([0-9]\.?[0-9]?) "+each)
                b = re.match(r,measure_string)
                if b:
                    return b, each
谢谢你看

[0-9]\.?[0-9]?
一旦出现数字,第一个[0-9]将匹配。 这个将匹配0-1个周期 [0-9]? 将匹配0-1个数字

因此,您的正则表达式将解析1、11、1.1,而不是1.11或11.1

如果您想解析以上所有内容,我建议您执行以下操作

([0-9]+(?:\.[0-9]+)?)(?:\s)
[0-9]+-匹配一个或多个数字
\-匹配1个周期
[0-9]*? - 匹配所有剩余数字。
()? - 输入此正则表达式0或1次

括号内的任何内容都将被捕获。如果您看到一个包含在(?:…)中的正则表达式,它是一个非捕获正则表达式。但是如果(…)包含在(…)中,它将被(…)正则表达式捕获。。。有点乱。但是上面提到的应该只捕捉数字,而不是空间

一旦出现数字,第一个[0-9]将匹配。 这个将匹配0-1个周期 [0-9]? 将匹配0-1个数字

因此,您的正则表达式将解析1、11、1.1,而不是1.11或11.1

如果您想解析以上所有内容,我建议您执行以下操作

([0-9]+(?:\.[0-9]+)?)(?:\s)
[0-9]+-匹配一个或多个数字
\-匹配1个周期
[0-9]*? - 匹配所有剩余数字。
()? - 输入此正则表达式0或1次

括号内的任何内容都将被捕获。如果您看到一个包含在(?:…)中的正则表达式,它是一个非捕获正则表达式。但是如果(…)包含在(…)中,它将被(…)正则表达式捕获。。。有点乱。但是上面的操作应该只捕获数字,而不捕获空间。

这样可以:

import re
def parse(measure_string,each):
    r = re.compile(r"\d+(\.\d*)?(?=\s"+each+")")
    b = re.match(r, measure_string)
    if(b):
        return b.group(0)
我们使用了带?=的正向前瞻,以便仅当浮点后面有空格和字符串
each
时才匹配浮点,但不将该空格和
each
包含在匹配中。 然后,我们返回匹配的字符串,其中包含
MatchObject.group(0)
,按照。

这将执行以下操作:

import re
def parse(measure_string,each):
    r = re.compile(r"\d+(\.\d*)?(?=\s"+each+")")
    b = re.match(r, measure_string)
    if(b):
        return b.group(0)
我们使用了带?=的正向前瞻,以便仅当浮点后面有空格和字符串
each
时才匹配浮点,但不将该空格和
each
包含在匹配中。 然后,我们返回匹配字符串,其中包含
MatchObject.group(0)
,请按照。

尝试:

\b(([1-9][0-9]*)?[0-9]\.[0-9]+)\b
与现实相匹配

\b(([1-9][0-9]*)?[0-9])\b
匹配简单

测试正则表达式的好地方:

试试:

\b(([1-9][0-9]*)?[0-9]\.[0-9]+)\b
与现实相匹配

\b(([1-9][0-9]*)?[0-9])\b
匹配简单


测试正则表达式的好地方:

有一个更精确的实数正则表达式:

“^[-+]?[0-9]*\.?[0-9]+(e[-+]?[0-9]+)?$”

还有一些检查这个regexp:

realnum=re.compile("^[-+]?[0-9]*\.?[0-9]+(e[-+]?[0-9]+)?$")

["yes" if realnum.match(test) else "no" for test in ["12", "+12", "-12", "-3.14", ".314e1", "+.01e-12", "+22.134e+2"]]
['yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes']

["yes" if realnum.match(test) else "no" for test in ["..12", "+-12", "-12.", "-3.14p", ".314e1.9", "+. 01e-12", "+22.134e"]]
['no', 'no', 'no', 'no', 'no', 'no', 'no']

有一个更精确的实数正则表达式:

“^[-+]?[0-9]*\.?[0-9]+(e[-+]?[0-9]+)?$”

还有一些检查这个regexp:

realnum=re.compile("^[-+]?[0-9]*\.?[0-9]+(e[-+]?[0-9]+)?$")

["yes" if realnum.match(test) else "no" for test in ["12", "+12", "-12", "-3.14", ".314e1", "+.01e-12", "+22.134e+2"]]
['yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes']

["yes" if realnum.match(test) else "no" for test in ["..12", "+-12", "-12.", "-3.14p", ".314e1.9", "+. 01e-12", "+22.134e"]]
['no', 'no', 'no', 'no', 'no', 'no', 'no']


您应该包括示例输入和输出。一些输入,expect输出示例将有助于澄清您的疑问OP询问正则表达式将匹配什么。“这是做什么用的?”诸如此类的东西你应该包括输入和输出的例子。一些输入,期望输出的例子将有助于澄清你的疑问——大概是正则表达式将匹配什么。“这是干什么用的?”这类事情关于
1.00000e-05
?是的,忘了。如果他需要,我可以很容易地把它添加到答案中。如果是在他的示例输入/输出中,我将修复解决方案是的,我忘记了额外的数字。谢谢,我认为这样做很好。如果这个匹配
.5
5.
?@Hyperboreus,我明确地写它是为了不处理这两个。那些数字的格式不正确。那10万E-05呢?是的,忘了。如果他需要,我可以很容易地把它添加到答案中。如果是在他的示例输入/输出中,我将修复解决方案是的,我忘记了额外的数字。谢谢,我认为这样做很好。如果这个匹配
.5
5.
?@Hyperboreus,我明确地写它是为了不处理这两个。这些数字的格式不正确。在Python中,您通常可以使用原始字符串表示法(也可能使用字符串格式):
r“\d+(\。\d*)?(?=\s{})”。在那里格式化(每个)
。添加了原始字符串表示法。在Python中,您通常可以使用原始字符串表示法(可能还有字符串格式):
r“\d+(\。\d*)?(?=\s{})”。格式(每个)
。添加了原始字符串表示法。