Exercism: Bob (Python)
一道简单字符串匹配的题,不过这是我最近花时间最多的一道题了。原因是之前看了一下python的正则表达式,想说只用正则表达式来做。但是废了半天劲也没写出很满意的答案。
看了看其他人的答案,感觉1)还是直接使用isupper()比较简单, 2)把单个匹配条件拆分出来再来做组合。
原版:
import re
RESPONSES = {
"^[\s]*$":"Fine. Be that way!",
"^[A-Z]+\?$": "Calm down, I know what I'm doing!",
"^[A-Z]+$": "Whoa, chill out!",
"^.*\?$": "Sure.",
".*": "Whatever."
}
def response(hey_bob):
msg = "".join([c for c in hey_bob if c.isalpha() or c =='?'])
if not msg and hey_bob.strip():
return "Whatever."
for pattern in RESPONSES:
if re.search(pattern, msg.strip()):
return RESPONSES[pattern]
改进版
import re
def is_question(msg):
return msg.strip()[-1] == '?'
def is_empty(msg):
return len(msg.strip()) == 0
def is_shouting(msg):
return msg.isupper()
RESPONSES = {
(is_empty,) :"Fine. Be that way!",
(is_shouting, is_question): "Calm down, I know what I'm doing!",
(is_shouting,): "Whoa, chill out!",
(is_question,): "Sure.",
(lambda x: True, ) : "Whatever."
}
def response(hey_bob):
for checks, res in RESPONSES.items():
if all(check(hey_bob) for check in checks):
return res
评论
发表评论