【问题标题】:RegEx for matching strings with spaces and wordsRegEx 用于匹配带有空格和单词的字符串
【发布时间】:2019-07-16 00:22:51
【问题描述】:

我有以下字符串:

快速棕色狐狸 abc(1)(x)

使用以下正则表达式:

(?i)(\s{1})(abc\(1\)\([x|y]\))

输出是

abc(1)(x)

这是预期的,但是,我似乎不能:

  1. 使用 \W \w \d \D 等提取超过 1 个空格
  2. 结合量词添加更多空格。

我想要以下输出:

快速棕色狐狸 abc(1)(x)

从主要查找“abc(1)(x)”中,我希望查找的任一侧最多包含 5 个单词。我的假设是空格会区分一个词。

编辑 1:

对于未来的示例,两边的 5 个单词将是未知的。字符串可能是:

戴黑帽子的猫是 abc(1)(x) 敏捷的棕色狐狸跳过 懒狗。

在这种情况下,所需的输出将是:

带黑帽的是 abc(1)(x) 快速的棕色狐狸跳跃

编辑 2:

编辑了第一个示例中的预期输出并添加了“最多”5 个单词

【问题讨论】:

  • “我想要两边各 5 个单词” 你想要的输出中这五个单词在哪里?
  • 这个特定示例的预期输出很清楚,但如果你再给出一句话,我不知道你想提取什么。请澄清您要做什么(关注what而不是how
  • 另外,您使用的是什么正则表达式风格(或编程语言)?
  • 谢谢 - 我已在原始问题中进行了编辑以解决这些问题
  • @qbbq 那么,您的意思是希望每边最多五个字吗?我仍然不清楚为什么第一个示例的预期输出以“quick”而不是“the”开头。你能澄清一下吗?

标签: python regex regex-lookarounds regex-group


【解决方案1】:
(?:[0-9A-Za-z_]+[^0-9A-Za-z_]+){0,5}abc\(1\)\([xy]\)(?:[^0-9A-Za-z_]+[0-9A-Za-z_]+){0,5}

请注意,我已将 \w+ 更改为 [0-9A-Za-z_]+\W+ 更改为 [^0-9A-Za-z_]+,因为根据您的语言环境/Unicode 设置,\W\w 可能不会按照您在 Python 中的预期方式运行。

另外请注意,我并没有专门寻找空格,只是“非单词字符”,这可能会更好地处理引号字符等的边缘情况。 但不管怎样,这应该能让你大部分时间到达那里。

顺便说一句:您称其为“环视” - 实际上它与正则表达式功能的“正则表达式环视”无关。

【讨论】:

    【解决方案2】:

    如果我正确理解你的要求,你想做这样的事情:

    (?:\w+[ ]){0,5}(abc\(1\)\([xy]\))(?:[ ]\w+){0,5}
    

    Demo.

    细分:

    (?:               # Start of a non-capturing group.
        \w+           # Any word character repeated one or more times (basically, a word).
        [ ]           # Matches a space character literally.
    )                 # End of the non-capturing group.
    {0,5}             # Match the previous group between 0 and 5 times.
    (                 # Start of the first capturing group.
        abc\(1\)      # Matches "abc(1)" literally.
        \([xy]\)      # Matches "(x)" or "(y)". You don't need "|" inside a character class.
    )                 # End of the capturing group.
    (?:[ ]\w+){0,5}   # Same as the non-capturing group above but the space is before the word.
    

    注意事项:

    • 要使模式不区分大小写,您可以使用 (?i) 开头,或者使用 re.IGNORECASE flag
    • 如果您想支持不以空格分隔的单词,您可以将[ ] 替换为\W+(表示非单词字符)或包含您想要支持的所有标点字符的字符类(例如,[.,;?! ])。

    【讨论】:

      猜你喜欢
      • 2017-05-09
      • 2019-09-12
      • 1970-01-01
      • 2022-11-19
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多