假设我有一个字符串的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。
我认为这可能是一种更优雅的方式,我很乐意提供指导。
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(空格)。