鱼C论坛

 找回密码
 立即注册
查看: 2483|回复: 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
可以使用正则表达式来匹配字符串中的数据,并将其转化成字典。

下面是代码示例:
import redata = "医疗服务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"pattern = r'(\D+)(\d+)[\/\?](\d+).*?([\d\.]+)\|'matches = re.findall(pattern, data)result = {}for match in matches:    key = match[0] + match[1]    value = float(match[3])    result[key] = valueprint(result)
输出结果为:
{'医疗服务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\.]+):匹配数字或小数点字符,至少出现一次,作为第四组;
· \|:匹配竖杠字符,作为结束符。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

下面是代码示例:
import redata = "医疗服务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"pattern = r'(\D+)(\d+)[\/\?](\d+).*?([\d\.]+)\|'matches = re.findall(pattern, data)result = {}for match in matches:    key = match[0] + match[1]    value = float(match[3])    result[key] = valueprint(result)
输出结果为:
{'医疗服务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\.]+):匹配数字或小数点字符,至少出现一次,作为第四组;
· \|:匹配竖杠字符,作为结束符。
想知道小甲鱼最近在做啥?请访问 -> 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]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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"
# 按?分隔
results = re.split(r'\?', data)
# 储存结果的字典
dic = {}
for r in results:

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

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

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

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

试下这个,没有考虑'|'后面的企业信息
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-28 02:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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