如果字符串只包含0-9,e,+;,-,则在python中进行优雅方式测试,空格、制表符

如果字符串只包含0-9,e,+;,-,则在python中进行优雅方式测试,空格、制表符,python,Python,如果字符串通过以下条件,我想找到用python进行测试的最有效、最简单的方法: 除以下内容外,不包含任何内容: 数字(数字0-9) 小数点:'.' 字母“e” 符号“+”或“-” 空格(任意数量) 选项卡(任意数量) 我可以很容易地用嵌套的“if”循环来实现这一点,但我想知道是否有更方便的方法 例如,我想要字符串: 0.0009017041601 5.13623e-05 0.00137531 0.00124203 为“真”,以下所有内容为“假”: # File gener

如果字符串通过以下条件,我想找到用python进行测试的最有效、最简单的方法:

  • 除以下内容外,不包含任何内容:
    • 数字(数字0-9)
    • 小数点:'.'
    • 字母“e”
    • 符号“+”或“-”
    • 空格(任意数量)
    • 选项卡(任意数量)
我可以很容易地用嵌套的“if”循环来实现这一点,但我想知道是否有更方便的方法

例如,我想要字符串:

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中