用于验证数字的Python正则表达式
我想为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
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.
的有效格式