我有一个看起来像的字符串:
"set<array<char, [100:140, 40:80]>>"
或
"set<array<struct{int foo, char bar}, [100:150, 50:80]>>"
“数组”中的结构基本上可以是基元的原语或结构,也可以是结构的结构。
使用python regex模块,我希望获得类似这个对象的返回:
{"base_type":"array", "type":"char"}
或者,对于第二个:
{"base_type":"array", "type":"struct", "sub_type":["int", "char"]}
也许有一种更优雅的方式来做到这一点,而不使用正则表达式。任何帮助将非常感激。 :)
答案 0 :(得分:2)
根据您提供的这两个测试用例,我提出了两个正则表达式:
"set<array<(char|float|int), .*>>"
。"set<array<struct{((int|char|float)\s+.*,)*\s+((int|char|float) .*)}, .*>>"
。您可以使用group来查找嵌套的主要类型以及结构中的类型。
这是我在python中的解决方案:
# -*- coding: utf-8 -*-
import re
primary_regex = "set<array<(char|float|int), .*>>"
struct_regex = (
"set<array<struct{((int|char|float)\s+.*,)*\s+((int|char|float) .*)}, .*>>"
)
def extract(define_str):
m = re.match(primary_regex, define_str)
result = {
'base_type': 'array',
}
if m is None:
m = re.match(struct_regex, define_str)
if m is None:
# Invalid define_str, return None
return None
# Result of m.groups() is a tuple alike
# ('int foo,', 'int', 'char bar', 'char')
sub_type = m.groups()[1::2]
result['type'] = 'struct'
result['sub_type'] = sub_type
else:
primary_type = m.group(1)
result['type'] = primary_type
return result
希望这会有所帮助。