【问题标题】:regex - how to match group of unique characters of certain length正则表达式 - 如何匹配特定长度的唯一字符组
【发布时间】:2013-11-04 21:11:09
【问题描述】:

我正在寻找一个正则表达式,它仅在其所有字符都是唯一的情况下才匹配特定长度的特定字符组。

对于给定的字符串示例:

123132213231312321112122121111222333211221331

123, 132, 213, 231, 312, 321 匹配并且 112, 122, 121, 111, 313, 322, 221, 323, 131等不匹配。

我试过(?:([0-9])(?!.{3}\1)){3}但完全错误

【问题讨论】:

  • 作为提示,this 网站可以帮助您可视化正则表达式匹配的内容。
  • 你能详细说明一下吗?
  • 正则表达式有什么特别的原因吗?不会很漂亮……
  • 我认为您甚至不需要正则表达式,它需要是正则表达式?
  • 我有 MB 的核苷酸序列,所以我猜它需要是正则表达式。

标签: python regex capturing-group


【解决方案1】:

遍历输入字符串,每次迭代都找到该表达式的匹配项,直至并包括前一个匹配项的第一个字符,直到没有匹配项:

((\d)((?!\2)\d)((?!\2)(?!\3)\d))

您可以执行 findAll,但您不会检测到重叠匹配,例如“12321”。你只会找到第一个:“123”

当然,这只适用于数字。如果你也想匹配单词字符,你可以这样做:

((\w)((?!\2)\w)((?!\2)(?!\3)\w))

如果您想要更长的长度,只需在构建正则表达式时遵循该模式即可:

((\w)((?!\2)\w)((?!\2)(?!\3)\w)((?!\2)(?!\3)(?!\4)\w))

所以,我只希望 Python 正确的代码...:

max=<your arbitrary length>
regex = "((\\w)"
for i in range(1, max-1):
    regex += "("
    for j in range(2, i+1):
        regex +="(?!\\"+j+")"
    regex += "\\w)"
regex = ")"

【讨论】:

    【解决方案2】:

    看来您正在使用python。正则表达式不是灵丹妙药,绝对不是解决问题的直接方法(特别是因为表达式会随着您要分析的长度而变化) 编写一点代码会更好,并提供更好的性能。

    这是解决问题的 Scala 代码示例

    "123132213231312321112122121111222333211221331".sliding(3).map(_.distinct).filter(_.size == 3).mkString("-")
    

    输出:

    123-231-132-213-132-231-312-123-321-321-213
    

    【讨论】:

      【解决方案3】:

      此正则表达式为 1-10 位数字,请自行选择。

       ( \d )
       (?! \1 )
       ( \d )
       (?! \1 | \2 )
       ( \d )
       (?! \1 | \2 | \3 )
       ( \d )
       (?! \1 | \2 | \3 | \4 )
       ( \d )
       (?! \1 | \2 | \3 | \4 | \5 )
       ( \d )
       (?! \1 | \2 | \3 | \4 | \5 | \6 )
       ( \d )
       (?! \1 | \2 | \3 | \4 | \5 | \6 | \7 )
       ( \d )
       (?! \1 | \2 | \3 | \4 | \5 | \6 | \7 | \8 )
       ( \d )
       (?! \1 | \2 | \3 | \4 | \5 | \6 | \7 | \8 | \9 )
       \d 
      

      【讨论】:

      • 呵呵别忘了添加x修饰符(?x)。我现在的投票数已满,稍后我会 +1
      • 你能详细说明一下吗?
      • @caxekis - 当然。每个处理数字不得是先前捕获的数字。由于您的示例说明了数字,因此上面的正则表达式显示了从 1 到 10 位的进展。 10 为最大值。将正则表达式裁剪为您希望找到的位数。你想做什么?
      猜你喜欢
      • 2012-03-27
      • 2011-06-17
      • 1970-01-01
      • 2019-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      相关资源
      最近更新 更多