futui 发表于 2023-5-17 09:19:55

关于正则的问题,请大师帮忙,谢谢!

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,.....},从而形成一个大字典

请大师帮忙,谢谢!

isdkz 发表于 2023-5-17 09:20:51

可以使用正则表达式来匹配字符串中的数据,并将其转化成字典。

下面是代码示例:

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"

pattern = r'(\D+)(\d+)[\/\?](\d+).*?([\d\.]+)\|'
matches = re.findall(pattern, data)

result = {}
for match in matches:
    key = match + match
    value = float(match)
    result = value

print(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\.]+):匹配数字或小数点字符,至少出现一次,作为第四组;
· \|:匹配竖杠字符,作为结束符。

futui 发表于 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

BrownSugar 发表于 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] = float(num_mc)
      else:
            dic] = None

print(dic)

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

试下这个,没有考虑'|'后面的企业信息
页: [1]
查看完整版本: 关于正则的问题,请大师帮忙,谢谢!