使用正则表达式在Python中解析子字符串

时间:2017-12-08 02:43:30

标签: python regex

我正在尝试使用re。

解析子字符串

从变量 s 中的字符串开始,我想将字符串分割到第一个(存储在s中的字符串有两个!< / strong>)并将其存储为子字符串。从此子字符串(存储在变量 result 中),我希望解析另一个子字符串。

这是代码,

import re
s='ecNumber*2.4.1.11#kmValue*0.57#kmValueMaximum*1.25#!ecNumber*2.3.1.11#kmValue*0.081#kmValueMaximum*#!'


Data={}

result = re.search('%s(.*)%s' % ('ec', '!'), s).group(1)
print result
ecNumber = re.search('%s(.*)%s' % ('Number*', '#kmValue*'), result).group(1)
Data["ecNumber"]=ecNumber
print Data

子字符串中存在的每个标记对应的值(例如:ecNumber)存储在*和#之间(例如:* 2.4.1.11#)。我试图解析为标记 ecNumber <存储的值/ em>在第一个子字符串中。 我获得的输出是

result='Number*2.4.1.11#kmValue*0.57#kmValueMaximum*1.25#!ecNumber*2.3.1.11#kmValue*0.081#kmValueMaximum*#'
{'ecNumber': '*2.4.1.11#kmValue*0.57#kmValueMaximum*1.25#!ecNumber*2.3.1.11#kmValue*0.081'}

所需的输出是

result= 'ecNumber*2.4.1.11#kmValue*0.57#kmValueMaximum*1.25#'
{'ecNumber': '2.4.1.11'}

我想存储每个标记及其对应的值。例如,

{'ecNumber': '2.4.1.11','kmValue':'0.021','kmValueMaximum':'1.25'}

2 个答案:

答案 0 :(得分:1)

你可以试试这个:

import re
s='ecNumber*2.4.1.11#kmValue*0.57#kmValueMaximum*1.25#' 
new_data = re.findall('(?<=^)[a-zA-Z]+(?=\*)|(?<=#)[a-zA-Z]+(?=\*)|(?<=\*)[-\d\.]+(?=#)', s)
final_data = dict([new_data[i:i+2] for i in range(0, len(new_data)-1, 2)])

输出:

{'kmValue': '0.57', 'kmValueMaximum': '1.25', 'ecNumber': '2.4.1.11'}

答案 1 :(得分:1)

尽管您要求使用正则表达式的解决方案,但我会说使用直接字符串操作更容易解决此问题,因为源字符串格式正确。

有关第一个i之前的信息:

print dict([i.split('*') for i in s.split('!', 1)[0].split('#') if i])

s中的所有信息:

print [dict([i.split('*') for i in j.split('#') if i]) for j in s.split('!') if j]