题目描述
记账本上记录了若干条多国货币金额,需要转换成人民币(fen),汇总后输出。每行记录一条金额,金额带有货币单位,格式为数字+单位,可能是单独的元,或者单独的分,或者分与元的组合。
要求将这些货币全部换算成人民币(fen)后进行汇总,汇总结果仅保留整数。小数部分舍弃。元和分的换算关系都是1:100,如下:
1CNY=100fen(1元=100分)
1HKD=100cents(1港元=100港分)
1JPY=100sen(1日元=100仙)
1EUR=100eurocents(1欧元=100欧分)
1GBP=100pence(1英镑=100便士)
输入描述:
第一行输入为N,N表示记录数。0<N<100
之后N行,每行表示一条货币记录,且该行只会是一种货币。
输出描述:
将每行货币转换成人民币分(fen)后汇总求和,只保留整数部分。
输出格式只有整数数字,不带小数,不带单位。
示例1
输入
1
100CNY
输出
10000
示例2
输入
1
100CNY100fen
输出
10100
编码思路
本题主要考查的知识点为正则表达式+字典。
首先用正则表达式从输入的字符串中提取数据+单位(100+GBP),然后利用字典来调取相应货币的汇率,即可计算出结果。
正则表达式
简单来说,正则表达式可以匹配文中全部符合指定格式的字串。这样说有些抽象,我们实际写代码理解一下。
初识正则表达
import re # 导入正则表达模块
ss = 'I like apples'
# 找到字符串中所有的e
r = re.findall('e',ss)
print(r)
# 输出结果
['e', 'e']
匹配所有字母
ss = "100CNY"
r = re.findall(r"[A-Z]",ss)
print(r)
# 输出结果
['C', 'N', 'Y']
匹配所有数字
ss = "100CNY"
r = re.findall(r"[0-9]",ss)
print(r)
# 输出结果
['1', '0', '0']
在上面的代码中,r"[0-9]“或r”[A-Z]"为正则表达式的匹配规则,其中[0-9]或[A-Z]使用了范围表示法,意为匹配0-9中任意一个数字,或A-Z任意一个大写字母。r代表raw string, 目前无需深究
匹配大写字母或小写字母
上面仅匹配了单一的字母或数字,但是如果我们既想匹配大写字母又想匹配小写字母怎么办?这个时候可以采取并列的写法,例如r"[A-Za-z]"
ss = 100CNY100fen
r = re.findall(r"[A-Za-z]",ss)
print(r)
# 输出结果
['C', 'N', 'Y', 'f', 'e', 'n']
使用量词匹配
在上面的代码块中,我们可以看到[‘C’, ‘N’, ‘Y’, ‘f’, ‘e’, ‘n’]是连在一起的,这使得我们无法区分CNY,和fen。在时,我们可以使用量词+来进行匹配,+代表至少出现一次。
ss = '100CNY100fen'
r1 = re.findall(r"[A-Za-z]+",ss)
print(r1)
r2 = re.findall(r"[0-9]+",ss)
print(r2)
# 输出结果
['CNY', 'fen']
['100', '100']
字符组简记法
上面的[0-9]可以写为\d,意为匹配数字,而[A-Za-z]可以写为\D,意为匹配一个非数字字符。
ss = '100CNY100fen'
r1 = re.findall(r"\D+",ss)
print(r1)
r2 = re.findall(r"\d+",ss)
print(r2)
最后得到了一样的结果
['CNY', 'fen']
['100', '100']
完整代码
exrateInfo = {'CNY':100,'JPY':1825,'HKD':123,'EUR':14,'GBP':12,
'fen':100,'sen':1825,'cents':123,'eurocents':14,'pence':12}
def curtofen(num,unit): # 将货币都换算成fen的函数
global exrateInfo
exrate = exrateInfo[unit]
if unit.isupper():
a = num* 100 * 100 / exrate
elif unit.islower():
a = num * 100 / exrate
return a
import re
n = int(input())
balance = 0
for i in range(n):
# 输入数据,并用正则表达式提取数据
ss = input()
num = re.findall(r"\d+",ss) # 数字
unit = re.findall(r"\D+",ss) # 单位
# 将所有的数据换算成分
for i in range(len(num)):
a = curtofen(int(num[i]),unit[i])
balance += a
print(int(balance))
最后,给大家推荐一本书,叫《正则指引》,这本书对于学习正则表达式很有帮助。
链接:https://pan.quark.cn/s/02fe3e209bc9
提取码:PQqD