用于寻找表现奇怪的回文的正则表达式

时间:2014-04-27 09:21:24

标签: python regex

我想写一个找到回文的程序(从开始到结束的单词和从anna开始结束的单词)。

但它也适用于多个单词car a rac和句子asdcar a racbnm

我写了一个正则表达式来查找回文开头的范围:

([a-z])(\s*)[a-z]?(\\2)(\\1)

它找到一个字母,然后可以有空格,然后可以有另一个字母,空格再次和第一个字母。

它工作正常,但对于字符串xxxxx,它表现得很奇怪:

import re
p = re.compile('([a-z])(\s*)[a-z]?(\\2)(\\1)')
finds = p.finditer('xxxxx')
for m in finds:
    print m.span()

输出

(0, 3)
(3, 5)

它找不到我正在搜索的那个:(1, 4)

我的问题出了什么问题?

编辑:它应该只找到回文的开头。该算法将完成其余的工作。

1 个答案:

答案 0 :(得分:3)

您的正则表达式无法与重叠区域匹配(您需要使用look-arounds with capturing groups来执行此操作)。

表达式首先匹配前三个x个字符;它匹配:

  • 一个字符(组1),零空格(组2),可选字符(?贪婪),组2中的零空格,组1中的一个字符。

第二场比赛然后 在此之后开始;两个xx个字符匹配,因为[a-z]?模式是可选的。

你不能创建一个正则表达式来匹配一般的回文(至少不能与Python re引擎匹配),因为没有任何工具可以反向匹配任意宽度的前一组。