python Challenge第三题

第三题给的提示是这样的: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:

  1. 1986 一个80后的blog » Twitter Weekly Update 2010-03-19

Leave a Reply