如何用Python正确解析含转义引号与空格的LR格式行?
正确解析LR格式行的方法
问题分析
要解析的行格式为LR "左侧字符串" "右侧字符串" [->],核心难点在于:
- 左右字符串内部可能包含空格
- 字符串内的引号是转义形式(
\"),不能作为字符串结束的判定标志 - 分隔左右字符串的是未被引号包裹的单个空格
解决方案1:改进状态机实现
你原有状态机的逻辑漏洞在于:遇到空格就标记分隔触发,但这个空格可能处于引号内部。正确逻辑应该是:仅当处于未被引号包裹的状态时,遇到的空格才是分隔符。
改进后的代码:
def parseLR(self, line) -> None: # 提取LR和->之间的核心内容 core_line = line.split("LR ")[1].split(" ->")[0].strip() left_chars = [] in_quote = False escaped = False for char in core_line: # 处理转义字符:遇到反斜杠则标记下一个字符为转义状态 if char == '\\' and not escaped: escaped = True left_chars.append(char) continue # 处理引号:仅非转义的引号会切换包裹状态 if char == '"' and not escaped: in_quote = not in_quote # 不在引号内且遇到空格时,左侧字符串结束 if char == ' ' and not in_quote: break left_chars.append(char) escaped = False # 转义状态仅持续一个字符 left_str = ''.join(left_chars) # 提取右侧字符串:跳过左侧内容和分隔空格 right_str = core_line[len(left_str)+1:].strip() print("左侧字符串:", left_str) print("右侧字符串:", right_str)
解决方案2:使用正则表达式
通过正则匹配带转义引号的字符串,核心模式为"((?:\\.|[^"\\])*)",含义是:
":匹配开头引号(?:\\.|[^"\\])*:非捕获组,匹配任意转义字符(\+任意字符)或非引号/非反斜杠的字符,重复任意次数":匹配结尾的非转义引号
代码实现:
import re def parseLR(self, line) -> None: core_line = line.split("LR ")[1].split(" ->")[0].strip() # 匹配两个带转义引号的字符串 pattern = r'"((?:\\.|[^"\\])*)"\s+"((?:\\.|[^"\\])*)"' match = re.fullmatch(pattern, core_line) if match: left_str = match.group(1) right_str = match.group(2) print("左侧字符串:", left_str) print("右侧字符串:", right_str) else: print("格式错误,无法解析")
测试验证
用你给出的三个测试案例验证,两种方案均能正确输出:
- 输入:
LR "redirect":"\\" "\"" ->
左侧字符串:redirect":"\,右侧字符串:" - 输入:
LR "name=\"uuid\" value=\"" "\""
左侧字符串:name="uuid" value=",右侧字符串:" - 输入:
LR "<span class=\"pointsNormal\">" "<" ->
左侧字符串:<span class="pointsNormal">,右侧字符串:<
内容的提问来源于stack exchange,提问作者Noah
相关产品推荐
相关产品推荐

