PTA L1-064 估值一亿的AI核心代码 (20分)
纪念第一次用正则解题。
题意:
字符串处理,其中有几个操作:
- 空格消去:去掉首尾空格,去掉标点符号前空格,行间多余空格变为一个。
- 除了大写 I I I,其余字母全变为小写(无论大写 I I I是单独还是在单词内)。
- 问号变为感叹号。
- 把两边被空格或者标点分开的词组 c a n y o u can\ you can you 和 c o u l d y o u could\ you could you分别变为 I c a n I\ can I can和 I c o u l d I\ could I could
- 再把两边被空格标点隔开的 I I I和 m e me me改为 y o u you you,注意4改过的不能再改回来。(难点)
题解:
- 首尾空格用 s t r i p strip strip消去,之后用到了 [ ] + [\quad]+ []+或者 \ s \backslash s \s表示数量大于1的空格, \ W \backslash W \W表示非字母数字下划线,包含了各种标点符号。
- 全体变小写用 l o w e r lower lower,会把 I I I一同变小写,可以新创一个字符串遍历原字符串来除掉 I I I,也可以用非字母的字符先把 I I I替换掉,变小写后再替换回来。
- 问号变感叹号 r e p l a c e replace replace即可做到。
- 四和五可以一起做,因为4改过之后5不能再改回来,他俩是互斥的,可以用另一串符号来替换掉4或者5中要求的字符串,比如 / ∗ / /*/ /∗/。用到了^来表示开头匹配,$来表示串尾匹配, ( ? < = ) (?<=\quad) (?<=)表示匹配串前面所需要的字符, ( ? = ) (?= \quad) (?=)表示匹配串后面所需要的字符, ∣ | ∣表示或。这样就能把所有在字符串中的被空格或者符号分隔开的匹配串找出来,一共包含四种情况,匹配串在开头,匹配串在结尾,匹配串在中间和串内只有匹配串。
代码:
import re
n = int(input())
for i in range(0, n):
s = input()
print(s)
print("AI: ", end="")
s = s.strip()
s = re.sub(r'[ ]+', " ", s)
s = re.sub(r'\s+(\W)', r'\1', s)
ss = ""
for i in s:
if i != 'I':
ss += i.lower();
else:
ss += i
ss = ss.replace("?", "!")
# 在开头 在中间 在结尾 同时在开头和结尾 4种情况
ss = re.sub(r'^(I|me)(?= |\W)|(?<= |\W)(I|me)(?= |\W)|(?<= |\W)(I|me)$|^(I|me)$', r'/*/', ss)
ss = re.sub(r'^can you(?= |\W)|(?<= |\W)can you(?= |\W)|(?<= |\W)can you$|^can you$', r'I can', ss)
ss = re.sub(r'^could you(?= |\W)|(?<= |\W)could you(?= |\W)|(?<= |\W)could you$|^could you$', r'I could', ss)
ss = re.sub(r'^/\*/(?= |\W)|(?<= |\W)/\*/(?= |\W)|(?<= |\W)/\*/$|^/\*/$', r'you', ss)
print(ss)