使用给定的分隔符集合拆分字符串并包含它们

问题描述 投票:0回答:1

假设我有一个字符串的python列表。字符串是C ++语言的标记,我将它们部分地标记出来。但是我留下了一些尚未被标记化的字符串。问题是,我必须在列表中包含一组语言符号。

例:

class Test 
{
    method int foo(boolean a, int b) { }
}

我需要的输出是:

tokens = ['class', 'Test', '{', 'method', 'int', 'foo', '(', 'boolean', 'a', ',', 'int', 'b', ')', '{', '}', '}']

我从空格中清除代码后获得的输出:

tokens = ['class', 'Test', '{', 'method', 'int', 'foo(boolean', 'a,', 'int', 'b){', '}', '}']

我使用的代码是使用根据空格分割的部分列表:

    def tokenize(self, tokens):
    """
    Breaks all tokens into final tokens as needed.
    """
    final_tokens = []
    for token in tokens:
        if not have_symbols(token):
            final_tokens.append(token)
        else:
            current_string = ""
            small_tokens = []
            for character in token:
                if character in SYMBOLS_SET:
                    if current_string:
                        small_tokens.append(current_string)
                        current_string = ""
                    small_tokens.append(character)
                else:
                    current_string += character
            final_tokens = final_tokens + small_tokens
    return final_tokens

其中SYMBOLS_SET是一组符号:

SYMBOLS_SET = {"{", "}", "(", ")", "[", "]", ".", ",", ";", "+", "-", "*", "/", "&", "|", "<", ">", "=", "~"}

如果token具有来自SYMBOL_SET的符号,则方法has_symbol(token)返回true,否则返回false。

我认为这可能是一种更优雅的方式,我很乐意提供指导。

python split
1个回答
1
投票
import re

input = r"""
class Test 
{
    method int foo(boolean a, int b) { }
}"""

SYMBOLS_SET = {"{", "}", "(", ")", "[", "]", ".", ",", ";", "+", "-", "*", "/", "&", "|", "<", ">", "=", "~"}

regexp = r"\s(" + "".join([re.escape(i) for i in SYMBOLS_SET]) + ")"

splitted = re.split(regexp, input)
tokens = [x for x in splitted if x not in [None, ""]]

print(tokens)

给你:

['class', 'Test', '{', 'method', 'int', 'foo', '(', 'boolean', 'a', ',', 'int', 'b', ')', '{', '}', '}']

SYMBOLS周围的Puttin parens使它们成为regexp子组,因此出现在输出中。我们不希望包含\ s(空格)。

© www.soinside.com 2019 - 2024. All rights reserved.