我试图在Python中实现一个脚本,该脚本会自动将测试序列(ERTMS子集-076-6-3)中定义的事件列表转换为更正式的定义;以便使用这种新形式在某些日志文件中搜索此事件。将半结构化文本列表转换为正式定义
的事件在一个半结构化的形式定义如下的例子:
“含有分组255被接收到一个应答器组的消息(NID_BG = BGB)”
“DMI符号状态(NID_MESSAGE_JRU = 21; DMI_SYMB_STATUS = < Bit66 = 0 & Bit68 = 0 & Bit70 = 0 & Bit72 = 0 & Bit74 = 0 & Bit76 = 0>)被记录”
- “行车制动介入被记录。”
- “SA-CONNECT.Confirm接收”
- “SA-DATA请求与欧洲广播消息 ”的通信会话的发起“(NID_MESSAGE = 155)被发送”
- “SA-DATA指示与欧洲广播收到“RBC/RIU系统版本”(NID_MESSAGE = 32)消息“
- 驱动程序的验证操作记录在JRU上。
我现在的计划是解析每个事件列表和保存,我可以在日志检查值(即NID_MESSAGE_JRU = 21 Bit66 = 0 Bit68 = 0 Bit70 = 0 Bit72 = 0 Bit74 = 0 Bit76 = 0)并且将正确条件的评估函数的名称:
def and():
return(NID_MESSAGE_JRU==21 && Bit66==0 && Bit68==0 && Bit70==0 && Bit72==0 && Bit74==0 && Bit76==0)
然后该程序,然后分析日志,搜索将返回真到了那个功能的信息,记录比赛看看其他条件。
现在我正在寻找一种方法来尽可能地自动化这个过程,因为它有700多个测试序列,每个测试序列大概有80个事件。
经过一番研究后,我发现使用解析器生成器可以满足我的需求,但是我被困在它们的绝对数量中,我无法选择哪一个更适合我的问题。
我想出了另一种解决方案是,以评估我的事件用一些简单的正则表达式,并使用它们产生的评估条件,然后使用eval()来评价他们,我已经从日志加载后的值:
s = "DMI SYMBOL STATUS (NID_MESSAGE_JRU=21; DMI_SYMB_STATUS=<Bit66=0&Bit68=0&Bit70=0&Bit72=0&Bit74=0&Bit76=0>) is recorded"
s1 = s[s.find("(")+1:s.find(" ")]
s2 = s[s.find("<")+1:s.find(">")]
condition = s1 + s2
condition = re.sub('[=]','==',condition)
condition = re.sub('[;&]', '&&',condition)
condition='NID_MESSAGE_JRU==21&&Bit66==0&&Bit68==0
&&Bit70==0&&Bit72==0&&Bit74==0&&Bit76==0'
对于哪个解析生成器适合我的需求,您有什么建议吗?还是应该继续使用正则表达式?或者我完全走错了路?
基准3次测试都可以在这里:http://www.era.europa.eu/Document-Register/Pages/Set-2-Test -Sequences.aspx – Riccardo
我无法下载测试序列文件(它们在大约35 MB下载时保持失败);设法通过将它们交叉加载到我的DropBox然后从那里下载来解决这个问题。 –
到目前为止:4个.zip测试文件总共包含733个.zip测试用例(每个测试用例略大于1 MB)。每种情况都包括一个.bmp(Windows位图)图像,用于绘制测试场景(如列车速度与距离),一个.doc(Word 97)文档,以及一个.mdb(Microsoft Access)数据库,该数据库包含事件的测试顺序29张桌子,其中一些是空的。我还没有弄清楚数据库模式,但它看起来基本上重复了.doc(仅仅因为一大堆额外的东西被铲除)。 –