用于验证数字的Python正则表达式

用于验证数字的Python正则表达式,python,regex,Python,Regex,我想为python代码段创建一个正则表达式 import re pattern = "\d*\.?\d+[Ee]?[+-]?\d*" r = re.compile(pattern) txt = """ 12 .12 12.5 12.5E4 12.5e4 12.4E+4 12E4 12e-4 """ x = r.findall(txt) print(x) 对于从txt中过滤所有有效的输入,这段代码很好 但输入无效,例如 .12e,12.3+4 也允许我如何修复此问题?您可以尝试:\d*\。?\d

我想为python代码段创建一个正则表达式

import re
pattern = "\d*\.?\d+[Ee]?[+-]?\d*"
r = re.compile(pattern)
txt = """
12
.12
12.5
12.5E4
12.5e4
12.4E+4
12E4
12e-4
"""
x = r.findall(txt)
print(x)
对于从txt中过滤所有有效的输入,这段代码很好 但输入无效,例如

.12e,12.3+4


也允许我如何修复此问题?

您可以尝试:
\d*\。?\d+(?:[Ee][+-]?\d+)$
。这将指数部分标记为一个组。我还添加了一个
$
,以确保它与字符串的结尾匹配

此外,由于正则表达式包含
\
,因此应该使用原始字符串文字,例如:
r'\n'
,它是文字
\n
,而不是新行字符


更简单的方法是使用
float()
并检查
ValueError
异常。

您可以尝试:
\d*\。?\d+(?:[Ee][+-]?\d+)$
。这将指数部分标记为一个组。我还添加了一个
$
,以确保它与字符串的结尾匹配

此外,由于正则表达式包含
\
,因此应该使用原始字符串文字,例如:
r'\n'
,它是文字
\n
,而不是新行字符


更简单的方法是使用
float()
并检查
ValueError
异常。

尝试将正则表达式更改为以下内容:

\d*\.?\d+(?:[Ee][+-]?\d+)?
这使得如果
e
e
在那里,则始终至少有一个数字,因此
+
-
只有在
e
e
之后才有效

请注意,您应该使用原始字符串文字来确保反斜杠被正确转义(不会特别影响此字符串,但如果您尝试在正则表达式中使用类似于
\b
的内容,您会看到区别):


尝试将正则表达式更改为以下内容:

\d*\.?\d+(?:[Ee][+-]?\d+)?
这使得如果
e
e
在那里,则始终至少有一个数字,因此
+
-
只有在
e
e
之后才有效

请注意,您应该使用原始字符串文字来确保反斜杠被正确转义(不会特别影响此字符串,但如果您尝试在正则表达式中使用类似于
\b
的内容,您会看到区别):


传统的regexp如下所示:

pattern = (
    "(?:"
    r"\d+(?:\.\d+)(:?[Ee][-+]?\d+)"
    "|"
    r"\.\d+(:?[Ee][+-]?\d+)"
    ")"
)
但你总是可以用简单的方式做事:

def is_number(x):
    try:
        float(x)
        return True
    except ValueError:
        return False

传统的regexp如下所示:

pattern = (
    "(?:"
    r"\d+(?:\.\d+)(:?[Ee][-+]?\d+)"
    "|"
    r"\.\d+(:?[Ee][+-]?\d+)"
    ")"
)
但你总是可以用简单的方式做事:

def is_number(x):
    try:
        float(x)
        return True
    except ValueError:
        return False

像这样的东西应该可以(未经测试):


像这样的东西应该可以(未经测试):


我建议您使用正则表达式模式

^(?=\.?\d)\d*(?:\.\d*)?(?:[eE][+-]?\d+)?$

我建议您使用正则表达式模式

^(?=\.?\d)\d*(?:\.\d*)?(?:[eE][+-]?\d+)?$

不需要时不要使用正则表达式。让Python确定哪些是有效的,这更像Python[tm](而且更容易、更可靠)

results = []
for line in txt.split():
    try:
        float(line)
    except ValueError:
        pass
    else:
        results.append(line)
print results

不需要时不要使用正则表达式。让Python确定哪些是有效的,这更像Python[tm](而且更容易、更可靠)

results = []
for line in txt.split():
    try:
        float(line)
    except ValueError:
        pass
    else:
        results.append(line)
print results

这可能是迄今为止最简单的:

^(\d*\.?\d+([Ee][+-]?\d+)?)$
将“^”和“$”替换为您希望delims成为的任何内容,包括空格或其他内容

解决方案说明:

你的解决方案

\d*\.?\d+[Ee]?[+-]?\d*
允许在没有数字的情况下放置E->因此在我的末尾放置\d+。
我还制作了E和可选+/-,然后是单个组中的下颌骨数字(即,将其全部括在括号中),这样它们就不能没有彼此而存在。整个组([Ee][+-]?\d+)是可选的(?)以适应没有该符号的数字示例。

给您,可能是最简单的:

^(\d*\.?\d+([Ee][+-]?\d+)?)$
将“^”和“$”替换为您希望delims成为的任何内容,包括空格或其他内容

解决方案说明:

你的解决方案

\d*\.?\d+[Ee]?[+-]?\d*
允许在没有数字的情况下放置E->因此在我的末尾放置\d+。
我还制作了E和可选+/-,然后是单个组中的下颌骨数字(即,将其全部括在括号中),这样它们就不能没有彼此而存在。整个组([Ee][+-]?\d+)是可选的(?)以适应没有该符号的数字示例。

或者,避免所有正则表达式,使用Python标记器查找它们:

test2.txt

有些颠簸
2.34
1.7e2
再来点颠簸

示例代码

from tokenize import generate_tokens, NUMBER

source = open('test2.txt').readline
numbers = [ (val, eval(val)) for typ, val, _, _, _ in generate_tokens(source) if typ==NUMBER]
print numbers
# [('2.34', 2.34), ('1.7e2', 170.0)]

或者,避免同时使用正则表达式,使用Python标记器查找它们:

test2.txt

有些颠簸
2.34
1.7e2
再来点颠簸

示例代码

from tokenize import generate_tokens, NUMBER

source = open('test2.txt').readline
numbers = [ (val, eval(val)) for typ, val, _, _, _ in generate_tokens(source) if typ==NUMBER]
print numbers
# [('2.34', 2.34), ('1.7e2', 170.0)]

这将使用捕获的组,您不需要它。添加了?:仅适用于您。:)这将使用捕获的组,您不需要它。添加了?:仅适用于您。:)投票赞成简单的方法。但是我会把
return True
放在
else
块中。真可怕。我认为,Try/catch不应该是你代码中不可或缺的一部分。@adamdunson这种观点与一般的python正好相反——EAFP:请求原谅比请求允许更容易。格言:“这种简洁快速的风格的特点是有许多尝试和例外的陈述。”@lazyr Good know。如果不是很明显的话,我对python还是相当陌生的,我想我仍然有很多类似C的习惯。赞成简单的方法。但是我会把
return True
放在
else
块中。真可怕。我认为,Try/catch不应该是你代码中不可或缺的一部分。@adamdunson这种观点与一般的python正好相反——EAFP:请求原谅比请求允许更容易。格言:“这种简洁快速的风格的特点是有许多尝试和例外的陈述。”@lazyr Good know。如果不是很明显,我对python还是相当陌生的,我想我仍然有很多类似C的习惯。@downvoter你应该对你否决的答案进行评论,并解释为什么你认为它们“没有用处”。@downvoter你应该对你否决的答案进行评论,并解释为什么你认为它们“没有用处”.Smile::不是
123.
的有效格式