实战分享 - 字符串切割汇率数据

客户想要实现每天在这个网站上公布的汇率公告中取出所有的汇率数据, 原网站为下图

实战分享 - 字符串切割汇率数据

客户最终想要的效果是将其中的数据以这种形式展现出来

实战分享 - 字符串切割汇率数据

通过设计器我们能够拿到以下文本, 们可以把这段文本作为要处理的源数据

中国人民银行授权中国外汇交易中心公布,2018年8月17日银行间外汇市场人民币汇率中间价为:1美元对人民币6.8894元,1欧元对人民币7.8437元,100日元对人民币6.2177元,1港元对人民币0.87767元,1英镑对人民币8.7700元,1澳大利亚元对人民币5.0078元,1新西兰元对人民币4.5426元,1新加坡元对人民币5.0150元,1瑞士法郎对人民币6.9172元,1加拿大元对人民币5.2425元,人民币1元对0.59477马来西亚林吉特,人民币1元对9.7017俄罗斯卢布,人民币1元对2.1319南非兰特,人民币1元对163.72韩元,人民币1元对0.53236阿联酋迪拉姆,人民币1元对0.54365沙特里亚尔,人民币1元对41.2736匈牙利福林,人民币1元对0.54868波兰兹罗提,人民币1元对0.9504丹麦克朗,人民币1元对1.3325瑞典克朗,人民币1元对1.2293挪威克朗,人民币1元对0.84600土耳其里拉,人民币1元对2.7565墨西哥比索,人民币1元对4.8139泰铢。

第一刀需要切出来的内容为红色文本:

中国人民银行授权中国外汇交易中心公布,2018 年 8 月 17 日银行间外汇市场人民币汇率中间价为:1美元对人民币6.8894元,1欧元对人民币7.8437元,100日元对人民币6.2177元,1港元对人民币0.87767元,1英镑对人民币8.7700元,1澳大利亚元对人民币5.0078元,1新西兰元对人民币4.5426元,1新加坡元对人民币5.0150元,1瑞士法郎对人民币6.9172元,1加拿大元对人民币5.2425元,人民币1元对0.59477马来西亚林吉特,人民币1元对9.7017俄罗斯卢布,人民币1元对2.1319南非兰特,人民币1元对163.72韩元,人民币1元对0.53236阿联酋迪拉姆,人民币1元对0.54365沙特里亚尔,人民币1元对41.2736匈牙利福林,人民币1元对0.54868波兰兹罗提,人民币1元对0.9504丹麦克朗,人民币1元对1.3325瑞典克朗,人民币1元对1.2293挪威克朗,人民币1元对0.84600土耳其里拉,人民币1元对2.7565墨西哥比索,人民币1元对4.8139泰铢

一个最无脑且非常好用的功能就是取出特定两段字符中间的所有字符. 使用到的方法是

data = aaa[aaa.find("汇率中间价为:") + 7:aaa.find("。")]`
#aaa 代表源数据
#该代码的意思是取出"汇率中间价为:"和"。"中间的所有字符

执行该段代码, 得到的结果是:

1美元对人民币6.8894元,1欧元对人民币7.8437元,100日元对人民币6.2177元,1港元对人民币0.87767元,1英镑对人民币8.7700元,1澳大利亚元对人民币5.0078元,1新西兰元对人民币4.5426元,1新加坡元对人民币5.0150元,1瑞士法郎对人民币6.9172元,1加拿大元对人民币5.2425元,人民币1元对0.59477马来西亚林吉特,人民币1元对9.7017俄罗斯卢布,人民币1元对2.1319南非兰特,人民币1元对163.72韩元,人民币1元对0.53236阿联酋迪拉姆,人民币1元对0.54365沙特里亚尔,人民币1元对41.2736匈牙利福林,人民币1元对0.54868波兰兹罗提,人民币1元对0.9504丹麦克朗,人民币1元对1.3325瑞典克朗,人民币1元对1.2293挪威克朗,人民币1元对0.84600土耳其里拉,人民币1元对2.7565墨西哥比索,人民币1元对4.8139泰铢

果然取出了上段代码中两个字符串中间的所有字符.
稍作观察, 不难发现, 每个汇率信息中间都被逗号分割开来了, 所以…

第二刀: 以逗号分割, 切!

data= data.split(",")

切完之后, 我们可以得到一个 list

['1美元对人民币6.8894元', '1欧元对人民币7.8437元', '100日元对人民币6.2177元', '1港元对人民币0.87767元', '1英镑对人民币8.7700元', '1澳大利亚元对人民币5.0078元', '1新西兰元对人民币4.5426元', '1新加坡元对人民币5.0150元', '1瑞士法郎对人民币6.9172元', '1加拿大元对人民币5.2425元', '人民币1元对0.59477马来西亚林吉特', '人民币1元对9.7017俄罗斯卢布', '人民币1元对2.1319南非兰特', '人民币1元对163.72韩元', '人民币1元对0.53236阿联酋迪拉姆', '人民币1元对0.54365沙特里亚尔', '人民币1元对41.2736匈牙利福林', '人民币1元对0.54868波兰兹罗提', '人民币1元对0.9504丹麦克朗', '人民币1元对1.3325瑞典克朗', '人民币1元对1.2293挪威克朗', '人民币1元对0.84600土耳其里拉', '人民币1元对2.7565墨西哥比索', '人民币1元对4.8139泰铢']

这个 list 里的每个元素都对应着一种货币的汇率信息.
我们拿第一个元素为例制作规则, 剩下所有的元素都可以试用

1美元对人民币6.8894元

第三刀, 用 "对" 字来切

data = data.split(“对”)

'1美元','人民币6.8894元'

切完了之后, 我们得到了一个由两个元素组成的 list.
我的思路是
1. 第一个元素的所有数字取出来
2. 第一个元素的所有汉字取出来
3. 第二个元素的所有数字取出来
4. 第二个元素的所有汉字取出来

都取出来之后按顺序写入表格后应该会是这样的效果

实战分享 - 字符串切割汇率数据

就是我们要的效果!!! 话不多说, 撸起袖子搞起来 ~

#将每个元素先单独提取出来
data1 = data[0]
data2 = data[1]
>>data1 = 1美元
>>data2 = 人民币6.8894元'
#将第一个元素的数字提取出来
first_number = re.sub("\D", "", data1) 
>>first_number = 1
#将第一个元素的汉字提取出来, 
first_hanzi = aaa1.replace(first_number,"") 
>>first_hanzi = 美元
#将第二个元素的数字提取出来
second_number = re.sub("[\u4e00-\u9fa5]", "", data2) #[\u4e00-\u9fa5]为中文字符集, 把所有中文都替换成空剩下的就是数字了
>>second_number = 6.8894
#将第二个元素的汉字提取出来, 
second_hanzi = re.sub(r"\d*\.{0,1}\d*","", aaa2) #"\d*\.{0,1}\d*"为所有浮点数的集合,都替换成空后, 剩下的就是汉字了
>>second_hanzi = 人民币元

连续运行得到的数据就是

1
美元
6.8894
人民币元

再加个 for 循环第二刀切出来的所有列表元素, 再依次把四个变量写入表格即可. 我打印出来看下效果:

1
美元
人民币元
6.8894
1
欧元
人民币元
7.8437
100
日元
人民币元
6.2177
1
港元
人民币元
0.87767
1
英镑
人民币元
8.7700
1
澳大利亚元
人民币元
5.0078
1
新西兰元
人民币元
4.5426
1
新加坡元
人民币元
5.0150
1
瑞士法郎
人民币元
6.9172
1
加拿大元
人民币元
5.2425
1
人民币元
马来西亚林吉特
0.59477
1
人民币元
俄罗斯卢布
9.7017
1
人民币元
南非兰特
2.1319
1
人民币元
韩元
163.72
1
人民币元
阿联酋迪拉姆
0.53236
1
人民币元
沙特里亚尔
0.54365
1
人民币元
匈牙利福林
41.2736
1
人民币元
波兰兹罗提
0.54868
1
人民币元
丹麦克朗
0.9504
1
人民币元
瑞典克朗
1.3325
1
人民币元
挪威克朗
1.2293
1
人民币元
土耳其里拉
0.84600
1
人民币元
墨西哥比索
2.7565
1
人民币元
泰铢
4.8139