关于正则的问题,请大师帮忙,谢谢!
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,.....},从而形成一个大字典
请大师帮忙,谢谢! 可以使用正则表达式来匹配字符串中的数据,并将其转化成字典。
下面是代码示例:
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: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 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]