鱼C论坛

 找回密码
 立即注册
查看: 2975|回复: 3

[已解决]关于正则的问题,请大师帮忙,谢谢!

[复制链接]
发表于 2023-5-17 09:19:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
data = "医疗服务2/43净值占比3.91|药明康德2?有色金属17/76净值占比3.87|钢研高纳17?电子元件16/135净值占比6.27|航天电器16?电源设备10/27净值占比7.01|新雷能10?航天航空5/37净值占比7.09|中航高科8;中航沈飞2?通信设备12/109净值占比2.81|七一二12?酿酒行业1/40净值占比2.8|贵州茅台1?非金属材料4/27净值占比11.38|菲利华6;华秦科技3"

我想把上面以问号分隔的n项,每一项的开始字符至数字的字符串作为字典的键,净值占比后面的数字至竖杠的数字作为值,做成字典,如{‘医疗服务’:3.91,'有色金属':3.87,.....},从而形成一个大字典

请大师帮忙,谢谢!
最佳答案
2023-5-17 09:20:51
可以使用正则表达式来匹配字符串中的数据,并将其转化成字典。

下面是代码示例:
  1. import re
  2. data = "医疗服务2/43净值占比3.91|药明康德2?有色金属17/76净值占比3.87|钢研高纳17?电子元件16/135净值占比6.27|航天电器16?电源设备10/27净值占比7.01|新雷能10?航天航空5/37净值占比7.09|中航高科8;中航沈飞2?通信设备12/109净值占比2.81|七一二12?酿酒行业1/40净值占比2.8|贵州茅台1?非金属材料4/27净值占比11.38|菲利华6;华秦科技3"
  3. pattern = r'(\D+)(\d+)[\/\?](\d+).*?([\d\.]+)\|'
  4. matches = re.findall(pattern, data)
  5. result = {}
  6. for match in matches:
  7.     key = match[0] + match[1]
  8.     value = float(match[3])
  9.     result[key] = value
  10. print(result)
复制代码

输出结果为:
  1. {'医疗服务2': 3.91, '有色金属17': 3.87, '钢研高纳17': 6.27, '航天电器16': 7.01, '新雷能10': 7.09, '中航高科8': 2.81, '七一二12': 2.8, '贵州茅台1': 11.38, '菲利华6': 3.0, '华秦科技3': 3.0}
复制代码

正则表达式的解释:

· (\D+):匹配任意非数字字符,至少出现一次,作为第一组;
· (\d+):匹配数字字符,至少出现一次,作为第二组;
· [\/\?]:匹配斜杠或问号字符,作为分隔符;
· (\d+):匹配数字字符,至少出现一次,作为第三组;
· .*?:匹配任意字符,任意次数,非贪婪模式;
· ([\d\.]+):匹配数字或小数点字符,至少出现一次,作为第四组;
· \|:匹配竖杠字符,作为结束符。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-5-17 09:20:51 | 显示全部楼层    本楼为最佳答案   
可以使用正则表达式来匹配字符串中的数据,并将其转化成字典。

下面是代码示例:
  1. import re
  2. data = "医疗服务2/43净值占比3.91|药明康德2?有色金属17/76净值占比3.87|钢研高纳17?电子元件16/135净值占比6.27|航天电器16?电源设备10/27净值占比7.01|新雷能10?航天航空5/37净值占比7.09|中航高科8;中航沈飞2?通信设备12/109净值占比2.81|七一二12?酿酒行业1/40净值占比2.8|贵州茅台1?非金属材料4/27净值占比11.38|菲利华6;华秦科技3"
  3. pattern = r'(\D+)(\d+)[\/\?](\d+).*?([\d\.]+)\|'
  4. matches = re.findall(pattern, data)
  5. result = {}
  6. for match in matches:
  7.     key = match[0] + match[1]
  8.     value = float(match[3])
  9.     result[key] = value
  10. print(result)
复制代码

输出结果为:
  1. {'医疗服务2': 3.91, '有色金属17': 3.87, '钢研高纳17': 6.27, '航天电器16': 7.01, '新雷能10': 7.09, '中航高科8': 2.81, '七一二12': 2.8, '贵州茅台1': 11.38, '菲利华6': 3.0, '华秦科技3': 3.0}
复制代码

正则表达式的解释:

· (\D+):匹配任意非数字字符,至少出现一次,作为第一组;
· (\d+):匹配数字字符,至少出现一次,作为第二组;
· [\/\?]:匹配斜杠或问号字符,作为分隔符;
· (\d+):匹配数字字符,至少出现一次,作为第三组;
· .*?:匹配任意字符,任意次数,非贪婪模式;
· ([\d\.]+):匹配数字或小数点字符,至少出现一次,作为第四组;
· \|:匹配竖杠字符,作为结束符。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-17 09:26:32 | 显示全部楼层
本帖最后由 futui 于 2023-5-17 09:31 编辑

'医疗服务2': 3.91, '有色金属17': 3.87, '钢研高纳17': 6.27, '航天电器16': 7.01, '新雷能10': 7.09, '中航高科8': 2.81, '七一二12': 2.8, '
没有把文字后的数字,完全去掉,请大师再看看
'医疗服务': 3.91, '有色金属': 3.87, '钢研高纳': 6.27, '航天电器': 7.01, '新雷能': 7.09, '中航高科': 2.81, '七一二': 2.8, '


key = match[0]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-17 17:48:47 | 显示全部楼层
  1. import re

  2. data = "医疗服务2/43净值占比3.91|药明康德2?有色金属17/76净值占比3.87|钢研高纳17?电子元件16/135净值占比6.27|航天电器16?电源设备10/27净值占比7.01|新雷能10?航天航空5/37净值占比7.09|中航高科8;中航沈飞2?通信设备12/109净值占比2.81|七一二12?酿酒行业1/40净值占比2.8|贵州茅台1?非金属材料4/27净值占比11.38|菲利华6;华秦科技3"
  3. # 按?分隔
  4. results = re.split(r'\?', data)
  5. # 储存结果的字典
  6. dic = {}
  7. for r in results:

  8.     # 匹配出现的全部中文
  9.     pattern = r'[\u4e00-\u9fa5]+'
  10.     zh_mc = re.findall(pattern, r)

  11.     # 匹配出现的全部数字
  12.     pattern = r'\d+\/\d+|\d+\.\d+'
  13.     num_mc = re.findall(pattern, r)

  14.     # 出现的第一个中文为键,第二个出现的数字为值
  15.     if zh_mc:
  16.         if len(num_mc) >= 2:
  17.             dic[zh_mc[0]] = float(num_mc[1])
  18.         else:
  19.             dic[zh_mc[0]] = None

  20. print(dic)
复制代码

输出结果:
  1. {'医疗服务': 3.91, '有色金属': 3.87, '电子元件': 6.27, '电源设备': 7.01, '航天航空': 7.09, '通信设备': 2.81, '酿酒行业': 2.8, '非金属材料': 11.38}
复制代码


试下这个,没有考虑'|'后面的企业信息
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-24 05:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表