我正在开发一个填字游戏编译器。
例如,假设有 8 个空白点,第二个点为“U”,第四个点为“E”,第六个点为“E”。
_U_E_E___
我有一个单词列表,我试图从中获取匹配的单词。如果我找到一个带有这种模式的 8 个字母的单词(TUBELESS),太棒了!但是,如果我能找到一个只匹配前 4 个槽 (TUBE) 的 4 个字母的单词,我也可以使用它。
我可以为每个可能的长度设置一个 RE,然后使用“|”组合它们但我正在寻找更优雅的解决方案。帮助?
请您参考如下方法:
使用嵌套可选组:.U.E(?:.(?:E(?:..?)?)?)?$
您可以使用一个简单的递归函数来构建模式:(几乎相同的模式,但即使是最后一个字符也被包裹在一个组中)
def nested_pattern(s):
if s:
return '(?:' + s[0] + nested_pattern(s[1:]) + ')?'
else:
return ''
import re
regex = re.compile(r'.U.E' + nested_pattern(r'.E..') + '$')
for word in ('TUB', 'TUBE', 'TEBU', 'TUBES', 'PURETE', 'TUBELEX', 'TUBELESS', 'SURELY'):
print word, bool(regex.match(word))
打印
TUB False
TUBE True
TEBU False
TUBES True
PURETE True
TUBELEX True
TUBELESS True
SURELY False
