【问题标题】:optimizing regex to fine key=value pairs, space delimited将正则表达式优化为精细的键=值对,空格分隔
【发布时间】:2014-09-22 03:36:29
【问题描述】:

在正则表达式中用我当前的正则表达式缩短 URL: http://bit.ly/1jbOFGd

我有一行 key=value 对,以空格分隔。有些值包含空格和标点符号,因此我会进行积极的前瞻来检查是否存在另一个键。

我想标记键和值,稍后我将其转换为 python 中的字典。

我的猜测是我可以通过摆脱 .* 来加快速度?但如何?在 python 中,我在 4.3 秒内转换了 10,000 行。我想通过使这个正则表达式匹配更有效来将速度提高一倍或三倍。

【问题讨论】:

    标签: regex python-2.7 optimization key


    【解决方案1】:

    更新:

    (?<=\s|\A)([^\s=]+)=(.*?)(?=(?:\s[^\s=]+=|$))
    

    我认为这个比你的效率更高(尽管它仍然使用 .*? 作为值,但它的前瞻远没有那么复杂并且不使用惰性修饰符),但我需要你去测试。这与我的原始表达式相同,但处理值的方式不同。它使用一个惰性.*? 匹配,后跟一个前瞻,即 either 一个空格、一个键、一个 = 或字符串的结尾。请注意,我总是将键定义为 [^\s=]+,因此键不能包含等号或空格(这种特殊性有助于我们避免惰性匹配)。

    Source


    原文:

    在做某事this simple 时,是否有一些我遗漏的规则?

    (?<=\s|\A)([^=]+)=([\S]+)
    

    这从一个空格字符 (\s) 或字符串开头 (\A) 的后视开始。然后我们匹配除= 之外的所有内容,然后是=,并匹配除空格(\s)之外的所有内容。

    【讨论】:

    • 刚刚注意到您的值中可以有空格(不知道为什么要使用空格分隔符),让我来回答一下。我假设键中至少不能有空格..
    • 非常感谢您迄今为止提供的一切!是的,值中的空格和标点符号无济于事:(但是,键中永远没有空格,所以这很好。
    • @jared 很抱歉问了一个可能多余的问题,但一切正常吗?空格和标点符号可以是值(不是键,它们可以是除空格和= 之外的任何东西),并带有更新的答案。你能测试一下吗?
    • 试图让它工作。得到一个 python 错误“look-behind requires fixed-width pattern”,所以现在就解决这个问题。顺便说一句,我喜欢 regex101,很棒的发现。
    • 处理 10,000 行的时间缩短到 1.5 秒。添加线程/多处理将从那里减少它。谢谢你的帮助山姆,你摇滚。
    【解决方案2】:

    “Lookbehind”(与“lookahead”和“lookaround”相关)是此处需要阅读的关键“正则表达式”概念 - 它让您可以匹配和跳过字符串的各个组成部分。

    这里有很好的例子:http://www.rexegg.com/regex-lookarounds.html。

    【讨论】:

      猜你喜欢
      • 2015-03-23
      • 2013-12-28
      • 2014-10-28
      • 1970-01-01
      • 2019-12-15
      • 2011-05-21
      • 2021-06-14
      • 2021-12-27
      • 2012-03-30
      相关资源
      最近更新 更多