我有一个以这样的形式保存文本文件的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?答案 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
。
请注意,对于数值计算,您需要将字段从字符向量转换为双精度。