我想为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
还允许我如何解决这个问题?
答案 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+)?
这使得如果e
或E
存在,则始终至少有一个数字,因此+
和-
仅在他们会关注e
或E
。
请注意,您应该使用原始字符串文字以确保正确转义反斜杠(特别是不会影响此字符串,但如果您尝试在正则表达式中使用\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)]