将python字典转换为MATLAB

时间:2018-07-07 17:12:20

标签: python regex matlab parsing

我有一个以这样的形式保存文本文件的python字典列表:

TEST BayesianSearch: Fold 1 results: {'AUC': 0.02361111111111111, 'precision': 0.012, 'recall': 0.0034607372805101266, 'map': 0.006173611111111111, 'NDCG': 0.0038391623343341052, 'MRR': 0.024472222222222218, 'F1': 0.005372169077405249, 'HR': 0.048, 'ARHR': 0.02458333333333333}

TEST BayesianSearch: Fold 2 results: {'AUC': 0.034277777777777775, 'precision': 0.016416666666666666, 'recall': 0.003939761087163834, 'map': 0.009020833333333329, 'NDCG': 0.0052255728628175955, 'MRR': 0.035861111111111094, 'F1': 0.006354527945317168, 'HR': 0.06566666666666666, 'ARHR': 0.0359722222222222}

在MATLAB中,

  • 如何找到以TEST BayesianSearch: Fold i results开头的i = 1、2、3、4、5?
  • 如何从这些行中取出数字?

1 个答案:

答案 0 :(得分:1)

使用支持命名捕获组的Matlab的regular expressions可以很好地完成任务。 在Matlab中使用命名的捕获组很方便,因为当使用正确的关键字names时,regexp会自动为您创建一个结构,将命名的捕获组作为字段。

对于指定了names关键字的字符向量 str 和正则表达式 expression ,文档指出:

  

如果str和expression都是字符向量或字符串标量,则输出为1-by-n结构数组,其中n为匹配数。结构字段名称与令牌名称相对应。

我用于此任务的正则表达式如下:

(?:TEST.*?(?=\d\.))(?<AUC>\d*\.\d*)(?:[,\s'a-z:]*)(?<precision>\d*\.\d*)(?:[,\s'a-z:]*)(?<recall>\d*\.\d*)(?:[,\s'a-z:]*)(?<map>\d*\.\d*)(?:[,\s'A-Z:]*)(?<NDCG>\d*\.\d*)(?:[,\s'A-Z:]*)(?<MMR>\d*\.\d*)(?:[,\s'A-Z:]*\d':\s)(?<F1>\d*\.\d*)(?:[,\s'A-Z:]*)(?<HR>\d*\.\d*)(?:[,\s'A-Z:]*)(?<ARHR>\d*\.\d*)

上面的表达式捕获命名捕获组中的所有数字。您可以找到正则表达式here的实时演示。


正则表达式说明:

  • (?:TEST.*?(?=\d\.))匹配但不捕获TEST,并使用正向先行匹配所有内容,直到第一个数字后跟小数点。
  • (?<AUC>\d*\.\d*)捕获名为AUC的组,捕获数字,小数点和更多数字。
  • (?:[,\s'a-z:]*)匹配但不捕获字符类中的所有内容,包括:逗号,空格,撇号,小写ASCII字符和冒号。
  • (?<precision>\d*\.\d*)捕获名为precision的组,捕获数字,小数点和更多数字。
  • (?:[,\s'a-z:]*)匹配但不捕获字符类中的所有内容,包括:逗号,空格,撇号,小写ASCII字符和冒号。
  • (?<recall>\d*\.\d*)捕获名为recall的组,捕获数字,小数点和更多数字。
  • (?:[,\s'a-z:]*)匹配但不捕获字符类中的所有内容,包括:逗号,空格,撇号,小写ASCII字符和冒号。
  • (?<map>\d*\.\d*)捕获名为map的组,捕获数字,小数点和更多数字。
  • (?:[,\s'A-Z:]*)匹配但不捕获字符类中的所有内容,包括:逗号,空格,撇号,大写ASCII字符和冒号。
  • (?<NDCG>\d*\.\d*)捕获名为NDCG的组,捕获数字,小数点和更多数字。
  • (?:[,\s'A-Z:]*)匹配但不捕获字符类中的所有内容,包括:逗号,空格,撇号,大写ASCII字符和冒号。
  • (?<MMR>\d*\.\d*)捕获名为MMR的组,捕获数字,小数点和更多数字。
  • (?:[,\s'A-Z:]*\d':\s)匹配但不捕获字符类中的所有内容,包括:逗号,空格,撇号,大写ASCII字符和冒号。然后是数字,撇号,冒号和空格。
  • (?<F1>\d*\.\d*)捕获名为F1的组,捕获数字,小数点和更多数字。
  • (?:[,\s'A-Z:]*)匹配但不捕获字符类中的所有内容,包括:逗号,空格,撇号,大写ASCII字符和冒号。
  • (?<HR>\d*\.\d*)捕获名为HR的组,捕获数字,小数点和更多数字。
  • (?:[,\s'A-Z:]*)匹配但不捕获字符类中的所有内容,包括:逗号,空格,撇号,大写ASCII字符和冒号。
  • (?<ARHR>\d*\.\d*)捕获名为ARHR的组,捕获数字,小数点和更多数字。

Matlab实施:

使用fileread读取文本文件并实现正则表达式。

关键字names用于返回每个命名令牌的名称文本

data = fileread('mytext.txt');
alldata = regexp(data,"(?:TEST.*?(?=\d\.))(?<AUC>\d*\.\d*)(?:[,\s'a-z:]*)(?<precision>\d*\.\d*)(?:[,\s'a-z:]*)(?<recall>\d*\.\d*)(?:[,\s'a-z:]*)(?<map>\d*\.\d*)(?:[,\s'A-Z:]*)(?<NDCG>\d*\.\d*)(?:[,\s'A-Z:]*)(?<MMR>\d*\.\d*)(?:[,\s'A-Z:]*\d':\s)(?<F1>\d*\.\d*)(?:[,\s'A-Z:]*)(?<HR>\d*\.\d*)(?:[,\s'A-Z:]*)(?<ARHR>\d*\.\d*)",'names')

然后,已实现的代码的输出为 1×2结构数组,其中命名的捕获组为字段。

alldata(1)

AUC: '0.02361111111111111'
precision: '0.012'
recall: '0.0034607372805101266'
map: '0.006173611111111111'
NDCG: '0.0038391623343341052'
MMR: '0.024472222222222218'
F1: '0.005372169077405249'
HR: '0.048'
ARHR: '0.02458333333333333'

alldata(2)

AUC: '0.034277777777777775'
precision: '0.016416666666666666'
recall: '0.003939761087163834'
map: '0.009020833333333329'
NDCG: '0.0052255728628175955'
MMR: '0.035861111111111094'
F1: '0.006354527945317168'
HR: '0.06566666666666666'
ARHR: '0.0359722222222222'

要访问数据,只需使用点符号,例如alldata(1).AUC。 请注意,对于数值计算,您需要将字段从字符向量转换为双精度。