回文的正则表达式

2024-05-20 10:10:45 发布

您现在位置:Python中文网/ 问答频道 /正文

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

  1. 长度为5
  2. 在前两个字符中,一个应该是大写字母,另一个应该是数字
  3. 第三个字符是小写字母。在

对我来说,主要的困难是团体推荐人的位置不确定。 如果我写'(((([A-Z])([0-9]))|(([0-9])([A-Z])))[a-z]\5\4)',那么只有K2i2K而不是{}匹配。为了匹配2KiK2,我必须写'(((([A-Z])([0-9]))|(([0-9])([A-Z])))[a-z]\8\7)'。在

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


Tags: 规则数字大写字母字符小写字母推荐人团体k2i2k
2条回答

我想说的是,让你的生活变得简单,在两个场景中使用一个简单的交替:

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

Demo


这将查找A-Z0-9a-z0-9A-Z或{},A-Za-zA-Z0-9。虽然您可能认为它会影响性能,但实际上不应该。它要么匹配A-Z,然后尝试走第一条路由(如果在任何一点失败,它将尝试匹配0-9,并在一个额外的步骤中失败),或者在A-Z失败,并尝试从0-9开始匹配。不管怎样,它实际上在成功/失败上只有一步之遥。在

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

它断言(带有正面的外观)有5个字符,并且前两个字符要么是大写数字,要么是数字大写对。在

一旦我们确定了这一点,剩下的就无关紧要了。我们捕获前两个字符,检查一个小写字母,然后以相反的顺序匹配前两个捕获。在

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

请参阅Regex101上的详细说明。在

相关问题 更多 >