无需大语言模型:如何分离无格式标记的Python字符串中的文本与代码
无需大语言模型:如何分离无格式标记的Python字符串中的文本与代码
嘿,这个问题确实挺常见的——没有格式标记的混合文本和代码拆分,不用LLMS的话,咱们可以靠代码的语法特征和上下文逻辑来搞定,我给你分享几个实用的思路和示例:
核心思路:基于代码的语法特征识别
不管是Python还是其他语言,代码都有自己独特的语法规律,咱们可以抓住这些规律来区分文本和代码:
- 起始关键词:比如Python的
def/class/import,Java的public/static,JavaScript的function/const,这些都是代码块常见的起始标识 - 缩进/块结构:像Python依赖缩进区分代码块,Java/C++用
{},这些结构和普通文本的换行逻辑差异很大 - 符号密度:代码里会频繁出现括号、冒号、运算符、引号这些符号,普通文本里这类符号的密度要低得多
具体实现示例(以Python为例)
下面是一个简单的Python函数,靠上下文和语法规则来拆分混合文本:
def split_text_and_code(raw_text): # 先把文本按行拆分 lines = [line.rstrip('\n') for line in raw_text.splitlines()] text_lines = [] code_lines = [] in_code_block = False code_indent_level = 0 for line in lines: stripped_line = line.strip() # 不在代码块时,判断是否进入代码块 if not in_code_block: # 匹配Python代码块的起始特征:关键词开头,或行尾带冒号(非空行) if (stripped_line.startswith(('def ', 'class ', 'import ', 'from ', 'if ', 'while ', 'for ', 'try ', 'with ')) or (stripped_line.endswith(':') and len(stripped_line) > 1)): in_code_block = True code_lines.append(line) # 记录代码块的起始缩进级别 code_indent_level = len(line) - len(stripped_line) else: text_lines.append(line) # 已经在代码块时,判断是否退出代码块 else: current_indent = len(line) - len(line.lstrip()) # 缩进级别大于等于起始缩进,或者是空行(代码里的空行),都算代码部分 if current_indent >= code_indent_level or stripped_line == '': code_lines.append(line) else: # 缩进回到文本级别,退出代码块 in_code_block = False text_lines.append(line) # 合并结果并去除首尾空白 separated_text = '\n'.join(text_lines).strip() separated_code = '\n'.join(code_lines).strip() return separated_text, separated_code # 测试你的示例文本 sample_text = """ Can you change sum operation to multiplication? def process(a: int, b: int): print(a + b) """ text_part, code_part = split_text_and_code(sample_text) print("文本部分:") print(text_part) print("\n代码部分:") print(code_part)
扩展到多语言的方法
如果要支持其他语言,你可以做一个语言规则字典,比如:
language_rules = { "python": ["def ", "class ", "import ", "from ", ":$"], "java": ["public ", "private ", "static ", "{"], "javascript": ["function ", "const ", "let ", "=>"] }
先遍历规则,判断当前文本里的代码属于哪种语言,再应用对应的识别逻辑,就能覆盖更多场景。
注意事项
这种方法不是100%完美的,如果文本里出现了类似代码的内容(比如用户写了“def 我的自定义函数”),可能会误判。你可以根据自己的实际场景调整规则,比如增加对参数定义、类型提示、函数调用的判断,来提升准确率。
备注:内容来源于stack exchange,提问作者Callme-Milad
相关产品推荐
相关产品推荐

