【问题标题】:Form reluctant regex from generic regexes从通用正则表达式中形成不情愿的正则表达式
【发布时间】:2018-09-06 05:13:37
【问题描述】:

我正在研究 scala/java 中一个非常通用的正则表达式案例。我有一组非常大的 url(~20 亿),我想根据它们匹配的正则表达式(~70k)为每个 url 分配一个 id。单个 url 可以映射到超过 1 个正则表达式。问题在于这组正则表达式。它们非常通用,因此会导致贪婪搜索。我试过使用 [\w\W]?代替 .(参见下面的示例)。但它仍然非常缓慢。我正在使用的环境是 Spark/scala。任何想法如何优化这个? 这是一个示例:

网址示例: https://www.amazon.com/dp/B07GC9PL97/ref=sspa_dk_detail_4?psc=1&pd_rd_i=B07GC9PL97&pf_rd_m=ATVPDKIKX0DER&pf_rd_p=a54d13fc-b8a1-4ce8-b285-d77489a09cf6&pf_rd_r=Z6B30TKHBX693HZ53QWP&pd_rd_wg=Z3avy&pf_rd_s=desktop-dp-sims&pf_rd_t=40701&pd_rd_w=k7nGf&pf_rd_i=desktop-dp-sims&pd_rd_r=220cc48e-b142-11e8-ad5d-f9d1f1abea37

正则表达式示例: .*amazon.*desktop-dp.* 将其转换为 [\w\W]*?amazon[\w\W]*?desktop-dp[\w\W]*?

【问题讨论】:

  • 我怀疑正则表达式是问题所在。不管你做得多快,比较 20 亿和 70k 都太慢了,即使正则表达式与加法花费的时间相同。
  • 我认为如果你可以将大约 70K 的正则表达式合并到一个巨大的有限状态机中,你可以只扫描每个 URL 一次(而不是大约 70K)。但是,有限状态机有可能不适合内存...
  • [\W\w]为什么?为什么[\W\w]. 更好???
  • 你的正则表达式 .*amazon.desktop-dp. 和它的替换 [\w\W]?amazon[\w\W]?desktop-dp[\w\W]* 只是非常轻微的相关。请修复所有错误并将您的代码用反引号括起来以正确格式化。还要添加更多的正则表达式......如果它们都像你展示的那样,我会使用别的东西。
  • @maaartinus 修复了正则表达式。 * 在堆栈溢出编辑框中也有特殊含义。

标签: java regex scala apache-spark optimization


【解决方案1】:

不,[\w\W] 匹配所有内容,而. 匹配除换行符之外的所有内容。所以我不认为,你可以通过切换它们获得任何东西。

你可以使用

.*?amazon.*?desktop-dp.*?

对于不情愿的搜索,但我不认为,这会有所帮助。您可以使用类似

的方法,而不是匹配此正则表达式
boolean hasTwoSubstringsInOrder(String haystack, String needle1, String needle2) {
    int index1 = heystack.indexOf(needle1);
    if (index1 == -1) return false;
    int index2 = heystack.lastIndexOf(needle2);
    if (index2 == -1) return false;
    return index1 + needle1.length() <= index2;

}

这很可能会更快,尽管增益可能不够。鉴于 URL 数量庞大,您可以使用一些预处理,例如提取所有相关标记,可能使用 string.split("[^-a-zA-Z0-9]") 之类的东西(但使用 Pattern.compile)。

显然,只有当 URL 同时包含 amazondesktop-dp 时,您的模式才能匹配。如果您的数据集不是那么大,我建议使用类似 Multimap&lt;String, String&gt; tokenMap 的方法将令牌映射到一组 URL,并使用 tokenMap.get("amazon")tokenMap.get("desktop-dp") 中较小的一个进行进一步处理。我对 spark 一无所知,但我敢打赌,它提供了类似的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多