PTA天梯赛-练习集 L1-064 估值一亿的AI核心代码 (20分)

PTA L1-064 估值一亿的AI核心代码 (20分)

纪念第一次用正则解题。

题意:

字符串处理,其中有几个操作:

  1. 空格消去:去掉首尾空格,去掉标点符号前空格,行间多余空格变为一个。
  2. 除了大写 I I I,其余字母全变为小写(无论大写 I I I是单独还是在单词内)。
  3. 问号变为感叹号。
  4. 把两边被空格或者标点分开的词组 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
  5. 再把两边被空格标点隔开的 I I I m e me me改为 y o u you you,注意4改过的不能再改回来。(难点)

题解:

  1. 首尾空格用 s t r i p strip strip消去,之后用到了 [ ] + [\quad]+ []+或者 \ s \backslash s \s表示数量大于1的空格, \ W \backslash W \W表示非字母数字下划线,包含了各种标点符号。
  2. 全体变小写用 l o w e r lower lower,会把 I I I一同变小写,可以新创一个字符串遍历原字符串来除掉 I I I,也可以用非字母的字符先把 I I I替换掉,变小写后再替换回来。
  3. 问号变感叹号 r e p l a c e replace replace即可做到。
  4. 四和五可以一起做,因为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)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值