如何从abc **** ef ****之类的字段中选择?

时间:2019-07-09 08:18:09

标签: regex regex-group kdb

我有一个包含以下字段的表:

t:([]id:til 5; field:("abc_xy_ef";"abc_ef";"abc_de";"abc_xy_uv";"abc_ef_ghi"))

id field       
---------------
0  "abc_xy_ef" 
1  "abc_ef"    
2  "abc_de"    
3  "abc_xy_uv" 
4  "abc_ef_ghi"

我只想选择字段遵循模式"abc_[anything]_ef[anything]"的行,以使结果表为:

id field       
---------------
0  "abc_xy_ef" 
1  "abc_ef"    
4  "abc_ef_ghi"

3 个答案:

答案 0 :(得分:7)

可以通过放置多个where子句来过滤所需结果来克服kdb中正则表达式的局限性

sa_d = []
ma_d = []
za_d = []
mo_d = []
for d, f in dn[['interview_country', 'interview_district']].values.tolist():
    if d == 'South Africa':
      sa_d.append(f)
    elif d == 'Malawi':
      ma_d.append(f)
    elif d == 'Zambia':
      za_d.append(f)
    elif d == 'Mozambique':
      zo_d.append(f)

显然,这不是最有效的方法,因为在每个子句之后,所有结果都将再次处理。您可以引入文档https://code.kx.com/v2/kb/regex/#regex-libraries

中指定的更全面的正则表达式库,例如pcre2或re2。

答案 1 :(得分:3)

Callum给出了正确的答案-双重过滤器是最好的方法。

出于好奇的目的,可以创建一个“状态机”来处理更高级的正则表达式,但在大规模情况下效率极低

q)m:({0};{2*x="a"};{3*x="b"};{4*x="c"};{5*x="_"};{5+x="e"};{7*x="f"};{7})
q)match:{7=1 m/x}
q)match["abc_xy_ef"]
1b
q)select from t where match each field
id field
---------------
0  "abc_xy_ef"
1  "abc_ef"
4  "abc_ef_ghi"

此处的详细信息:https://code.kx.com/v2/kb/regex/#regex-in-q

答案 2 :(得分:1)

正如其他人所述,KDB当前不支持此正则表达式匹配。

如果您有多个模式,或者可以将模式分解为多个模式,那么您也可以在单个条件下进行匹配。

例如,如其他答案所述,您可以将模式分为两个“ * abc *”和“ * ef *”。然后匹配所有模式,然后选择与所有模式匹配的行。

    request.post('https://slack.com/api/oauth.access', requestOptions, function(err, response, body) {
        // Send OAuth 2.0 request
        var body = JSON.parse(body);

        if (body.ok) {
            // Write data to the config file 
            writeInstallFile(body); 

            res.render('auth', {
                _webhook: body.incoming_webhook.channel,
                _botuser: body.bot.bot_user_id ? 'Yes' : 'No',
                _team: body.team_name
            });
        }
    });

您可以在列表中添加更多模式。

性能将取决于数据模式。如果第一个模式的匹配项更多,则此解决方案的运行速度比where子句中的多个条件运行更快,反之亦然。

下面的示例通过复制示例表中的记录以增加第一个模式的匹配项来创建表。该解决方案运行速度很快,因为第一个模式有多个匹配项。

q)  select from t where all field like/: ("*abc*";"*ef*")

类似地,由于下表中第一个模式的匹配为0,因此多个过滤器解决方案运行速度很快。

q) t:1000000#([]id:til 5; field:("abc_xy_ef";"abc_ef";"abc_de";"abc_xy_uv";"abc_ef_ghi"))
q) \ts select from t where all field like/: ("*abc*";"*ef*") ; / 46 25166144
q) \ts select from t where field like "abc*", field like "*ef*"; / 53 25166144

因此,对于具有不同数据模式的相同表大小,基本上该解决方案将花费或多或少的时间。