如果字符串只包含0-9,e,+;,-,则在python中进行优雅方式测试,空格、制表符
如果字符串通过以下条件,我想找到用python进行测试的最有效、最简单的方法:如果字符串只包含0-9,e,+;,-,则在python中进行优雅方式测试,空格、制表符,python,Python,如果字符串通过以下条件,我想找到用python进行测试的最有效、最简单的方法: 除以下内容外,不包含任何内容: 数字(数字0-9) 小数点:'.' 字母“e” 符号“+”或“-” 空格(任意数量) 选项卡(任意数量) 我可以很容易地用嵌套的“if”循环来实现这一点,但我想知道是否有更方便的方法 例如,我想要字符串: 0.0009017041601 5.13623e-05 0.00137531 0.00124203 为“真”,以下所有内容为“假”: # File gener
- 除以下内容外,不包含任何内容:
- 数字(数字0-9)
- 小数点:'.'
- 字母“e”
- 符号“+”或“-”
- 空格(任意数量)
- 选项卡(任意数量)
0.0009017041601 5.13623e-05 0.00137531 0.00124203
为“真”,以下所有内容为“假”:
# File generated at 10:45am Tuesday, July 8th
# Velocity: 82.568
# Ambient Pressure: 150000.0
Time(seconds) Force_x Force_y Force_z
你可以试试这个。如果有一个匹配,它是通过,否则失败。这里x将是你的字符串
您可以尝试此操作。如果有匹配项,则为pass-else-fail。这里的x将是您的字符串。对于正则表达式来说,这很简单,使用: 然而,(根据规则)这也将匹配
eeeee
或+-e-+
等
如果您真正想做的是检查给定字符串是否为有效数字,那么您可以使用
try:
num = float(subject)
except ValueError:
print("Illegal value")
这将处理诸如
“+34”
或“-4e-50”
或“3.456e7”
之类的字符串,这些字符串对于正则表达式来说非常简单,使用:
然而,(根据规则)这也将匹配eeeee
或+-e-+
等
如果您真正想做的是检查给定字符串是否为有效数字,那么您可以使用
try:
num = float(subject)
except ValueError:
print("Illegal value")
这将处理字符串,如
“+34”
或“-4e-50”
或“3.456e7”
您不需要使用正则表达式,只需使用测试列表和所有操作:
>>> from string import digits
>>> test_list=list(digits)+['+','-',' ','\t','e','.']
>>> all(i in test_list for i in s)
演示:
您不需要使用正则表达式,只需使用测试列表和all
操作即可:
>>> from string import digits
>>> test_list=list(digits)+['+','-',' ','\t','e','.']
>>> all(i in test_list for i in s)
演示:
检查字符串是否只有必需字符的最简单方法是使用string.translate方法
num = "1234e+5"
if num.translate(None, "0123456789e+- \t"
print "pass"
else:
print "Wrong character present!!!"
您可以在translate方法的第二个参数处添加除我提到的以外的任何字符。检查字符串是否只有所需字符的最简单方法是使用string.translate方法
num = "1234e+5"
if num.translate(None, "0123456789e+- \t"
print "pass"
else:
print "Wrong character present!!!"
您可以在translate方法中的第二个参数处添加除我提到的以外的任何字符。从性能角度看,运行正则表达式检查的成本很高,具体取决于表达式。此外,对每个有效行(即值应为“True”的行)运行正则表达式检查也会带来高昂的成本,特别是因为您将使用正则表达式解析每一行,并再次解析同一行以获得数字
你没有说你想对数据做什么,所以我将根据经验假设一些事情
首先,在这种情况下,我会确保数据源的格式始终相同。以您的示例为模板,我将定义以下约定:
忽略第一个非空字符为哈希符号的任何行
忽略任何空行
任何只包含空格的行都将被忽略
这种约定使解析变得更加容易,因为您只需要一个正则表达式来适应规则1.
到3.
:^\s*(#|$)
,即任意数量的空格后跟哈希符号或行尾。在性能方面,此表达式仅在包含空格且仅包含空格时扫描整行,这不会经常发生。在其他情况下,表达式扫描一行并在第一个非空格字符处停止,这意味着将很快检测到注释,因为一旦遇到哈希,扫描将在大多数情况下在0
位置停止
如果您还可以强制执行以下约定:
- 其余行中的第一个非空行是带有列名的标题
- 样本之间没有空白行
- 示例中没有注释
然后,您的代码将执行以下操作:
将行读入行
,只要重新匹配(r'^\s*(#|$)',行)
计算为真
李>
继续,将标题从下一行读入line
:headers=line.split()
您可以使用一个namedtuple
作为行布局-我假设它在同一个数据表中保持不变:
class WindSample(namedtuple('WindSample', 'time, force_x, force_y, force_z')):
def __new__(cls, time, force_x, force_y, force_z):
return super(WindSample, cls).__new__(
cls,
float(time),
float(force_x),
float(force_y),
float(force_z)
)
然后,对于每个行
,解析有效行将包括以下内容:
try:
data = WindSample(*line.split())
except ValueError, e:
print e
变量数据将包含以下内容:
>>> print data
WindSample(time=0.0009017041601, force_x=5.13623e-05, force_y=0.00137531, force_z=0.00124203)
好处有两个:
仅对最小的行集(即空行和注释)运行代价高昂的正则表达式李>
您的代码解析浮点数,每当解析产生无效内容时,都会引发异常
就性能而言,运行正则表达式检查的成本很高,具体取决于表达式。此外,对每个有效行(即值应为“True”的行)运行正则表达式检查也会带来高昂的成本,特别是因为您将使用正则表达式解析每一行,并再次解析同一行以获得数字
你没有说你想对数据做什么,所以我将根据经验假设一些事情
首先,在这种情况下,我会确保数据源的格式始终相同。以您的示例为模板,我将定义以下约定:
忽略第一个非空字符为哈希符号的任何行
忽略任何空行
任何只包含空格的行都将被忽略
这种约定使解析变得更加容易,因为您只需要一个正则表达式来适应规则1.
到3.
:^\s*(#|$)
,即任意数量的空格后跟哈希符号或行尾。在性能方面,此表达式仅在包含空格且仅包含空格时扫描整行,这不会经常发生。在其他cas中