Python正则表达式用不同的括号分割字符串

时间:2016-03-19 02:52:37

标签: python regex

我有一个看起来像的字符串:

"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"]}

也许有一种更优雅的方式来做到这一点,而不使用正则表达式。任何帮助将非常感激。 :)

1 个答案:

答案 0 :(得分:2)

根据您提供的这两个测试用例,我提出了两个正则表达式:

    对于嵌套了主要类型的这些案例,
  1. "set<array<(char|float|int), .*>>"
  2. 对于结构类型嵌套的这些情况,
  3. "set<array<struct{((int|char|float)\s+.*,)*\s+((int|char|float) .*)}, .*>>"
  4. 您可以使用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
    

    希望这会有所帮助。