回文的正则表达式

时间:2014-08-04 20:10:16

标签: python regex

我正在寻找一种特殊的回文。规则是

  1. 长度为5;
  2. 在前两个字符中,一个应为大写字母,另一个应为数字;
  3. 第三个字符是小写字母。
  4. 对我来说,主要的困难是群体参考的未确定位置。 如果我写'(((([A-Z])([0-9]))|(([0-9])([A-Z])))[a-z]\5\4)',则只会匹配K2i2K但不会2KiK2。要匹配2KiK2,我必须写'(((([A-Z])([0-9]))|(([0-9])([A-Z])))[a-z]\8\7)'

    那么我应该如何编写正则表达式?谢谢。

2 个答案:

答案 0 :(得分:4)

\b(?=.{5})(?=(?:[A-Z]\d|\d[A-Z]))(.)(.)[a-z]\2\1\b

这断言(正面预测)有5个字符,前两个字母是Capital-Digit或Digit-Capital对。

一旦我们确定了这一点,其余的都是微不足道的。我们捕获前两个字符,检查小写字母,然后按相反的顺序匹配前两个捕获。

我还使用单词边界(\b)包围正则表达式,以确保它在单词的中间不匹配。

Regex101上查看并附上详细说明。

答案 1 :(得分:2)

我想说让你的生活变得简单,只需使用一个简单的替换方案:

([A-Z])([0-9])[a-z]\2\1|([0-9])([A-Z])[a-z]\4\3

Demo


这会查找A-Z0-9a-z0-9A-Z0-9A-Z,{ {1}},a-zA-Z。虽然您可能认为它会受到性能影响,但它确实不应该。它将匹配0-9并尝试转到第一条路线(如果它在任何时候失败,它将尝试匹配A-Z并失败并增加一步)或者在0-9失败并且尝试从A-Z开始匹配。无论哪种方式,它只能在成功/失败方面有一个额外的步骤。