我想写一个找到回文的程序(从开始到结束的单词和从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)
我的问题出了什么问题?
编辑:它应该只找到回文的开头。该算法将完成其余的工作。
答案 0 :(得分:3)
您的正则表达式无法与重叠区域匹配(您需要使用look-arounds with capturing groups来执行此操作)。
表达式首先匹配前三个x
个字符;它匹配:
?
贪婪),组2中的零空格,组1中的一个字符。第二场比赛然后 在此之后开始;两个xx
个字符匹配,因为[a-z]?
模式是可选的。
你不能创建一个正则表达式来匹配一般的回文(至少不能与Python re
引擎匹配),因为没有任何工具可以反向匹配任意宽度的前一组。