正则表达式 - 如何匹配一定长度的唯一字符组

时间:2013-10-25 16:34:21

标签: python regex capturing-group

我正在寻找一个正则表达式,只有当它的所有字符都是唯一的时,它才会匹配特定长度的特殊字符组。

对于给定的字符串示例:

  

123132213231312321112122121111222333211221331

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

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

3 个答案:

答案 0 :(得分:2)

迭代输入字符串,每次迭代找到此表达式的匹配,切断并包括上一个匹配的第一个字符,直到没有匹配:

((\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 = ")"

答案 1 :(得分:2)

好像你正在使用python。正则表达式不是一个银弹,绝对不是你的问题的直接解决方案(特别是因为表达式改变你想要分析的长度) 编写一些代码会更好,并提供更好的性能。

以下是Scala中解决问题的代码示例

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

输出:

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

答案 2 :(得分:1)

此正则表达式是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