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

时间:2012-10-23 20:11:37

标签: 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

还允许我如何解决这个问题?

8 个答案:

答案 0 :(得分:1)

传统的正则表达式是这样的:

pattern = (
    "(?:"
    r"\d+(?:\.\d+)(:?[Ee][-+]?\d+)"
    "|"
    r"\.\d+(:?[Ee][+-]?\d+)"
    ")"
)

但你可以随时轻松地做事:

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

答案 1 :(得分:1)

我建议你使用正则表达式

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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

\d*\.?\d+(?:[Ee][+-]?\d+)?

这使得如果eE存在,则始终至少有一个数字,因此+-仅在他们会关注eE

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

pattern = r"\d*\.?\d+(?:[Ee][+-]?\d+)?"

答案 5 :(得分:0)

这样的事情应该这样做(未经测试):

"\d*\.?\d+(?:[Ee][+-]\d)?\d*"

答案 6 :(得分:0)

你在这里,可能是最简单的:

^(\d*\.?\d+([Ee][+-]?\d+)?)$

将^和$替换为你想要的delims,空格或其他什么。

解决方案解释:

您的解决方案

\d*\.?\d+[Ee]?[+-]?\d*

允许E没有数字 - >因此我的最后是\ d +。 我还制作了E和可选的+/-,然后是单个组中的那个manditory数字(即,将它全部括在括号中),这样它们就不能彼此存在。整个组([Ee] [+ - ]?\ d +)是可选的(?),以适应您的数字示例而无需注意。

答案 7 :(得分:0)

或者,一起避免使用正则表达式,使用Python标记生成器来查找它们:

<强>的test2.txt

  一些bumph
  2.34
  1.7e2
  更多bumph

示例代码

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)]