我有下面的输入列表,我想提取名称,符号,值和单位,并作为字典输出。
例如,输入:
x = ['abc >123%', 'Abc5d 12.3%', 'Hz-xyz = 321k/mL', 'N+ 456', '789 mm/min/1.3', '<=55']
字符串
预期的输出:
out = {
'x1':{
'name':'abc',
'symbol': '>',
'value': '123',
'unit': '%'
},
'x2':{
'name':'Abc5d',
'symbol': None,
'value': '12.3',
'unit': '%'
},
'x3':{
'name':'Hz-xyz',
'symbol':'=',
'value': '321',
'unit': 'k/mL'
},
'x4':{
'name':'N+',
'symbol': None,
'value': '456',
'unit': None
},
'x5':{
'name': None,
'symbol': None,
'value': '789',
'unit': 'mm/min/1.3'
},
'x6':{
'name': None,
'symbol': '<=',
'value': '55',
'unit': None
}
}
型
我使用下面的代码行,但输出与预期的输出不一样。
def extract_info(x):
out = {}
pattern = r'([A-Za-z0-9-]+)\s*([><=]{0,2})\s*([0-9.]+)\s*([A-Za-z/%]+)?'
for i, string in enumerate(x, start=1):
match = re.match(pattern, string)
name, symbol, value, unit = match.groups() if match else (None, None, None, None)
out[f'x{i}'] = {'name': name, 'symbol': symbol, 'value': value, 'unit': unit}
return out
型
有人能建议如何正确地编写正则表达式,以从Python中的输入列表中获得预期的输出吗?
- 谢谢-谢谢
4条答案
按热度按时间ubbxdtey1#
字符串
输出量:
型
ylamdve62#
字符串
产出
型
flseospp3#
在这四个部分中:名称、符号、值和单位;只有该值是强制性的,其他部分是可选的。另外,空白空间可以在部件之间。这意味着正则表达式可以很复杂。处理复杂正则表达式的最好方法是使用
re.VERBOSE
标志来编译它。此标志允许表达式中有额外白色和注解,使其更易于理解。字符串
输出如下:
型
备注
(?P<symbol>...)
表达式为该段提供了一个名称:“symbol”。此名称是groupdict()
返回的字典中的键{0,1}
表示此段可能发生0次或1次。换句话说,它最多发生1次。re.VERBOSE
标志来编译正则表达式,所以我们可以自由地向表达式中添加空行和白色。他们被忽视了。{k: v or None for k, v in matched.groupdict().items()}
代码段将任何空字符串“”转换为None
kh212irz4#
这将把所有字段推到正确的匹配位置。
字符串
产出
型
正则表达式布局
型