第三题给的提示是这样的:One small letter, surrounded by EXACTLY three big bodyguards on each of its sides.每个小字母的左右两侧各有三个大字字母。找出所有这样的小写字母,就胜利了。
第三题的地址:http://www.pythonchallenge.com/pc/def/equality.html
根据这样的描述,我首先想到的就是正则的环视。左三个右三个:(?<=[A-Z]{3})[a-z](?=[A-Z]{3})
但是这个正则又会匹配上AAAAAAaAAA或者AAAaAAAAAA这样的字符串。
接着改:(?<=([^A-Z]|\b)[A-Z]{3})[a-z](?=[A-Z]{3}([^A-Z]|\b)),用到了元字符\b。括号会‘记住’它们包含的子表达式匹配的内容,我们需要‘记住’的只是[a-z],所以最终版本的正则是这样的:
(?<=(?:[^A-Z]|\b)[A-Z]{3})[a-z](?=[A-Z]{3}(?:[^A-Z]|\b))
python代码是:
''.join(re.findall('(?<=(?:[^A-Z]|\b)[A-Z]{3})[a-z](?=[A-Z]{3}(?:[^A-Z]|\b))', data))
结果:’linkedlist’
本次学习到的主要是正则的环视,以及(…)、(?:…)的使用。
One Response to python Challenge第三题
Trackbacks/Pingbacks: