尝试使用 python 逐个字符解析一行

Attempting to parse a line, character by character using python

提问人:Noah 提问时间:7/3/2023 最后编辑:Noah 更新时间:7/4/2023 访问量:68

问:

我有一条线,根据输入的不同,它看起来会有所不同。我目前不起作用的方法是使用它循环它,这样我就可以得到当前位置。
该行由单词“LR”组成,然后是“左”字符串和用空格分隔的“右”字符串。问题是,您不能在所有空格上拆分它,因为有时左字符串和/或右字符串本身就有一个空格,导致实际的左字符串或右字符串被拆分不止一次。 演示这一点的 2 个示例输入是:
range()

LR "redirect\":\"\\" "\"" ->

这个你不会有问题 使用空格分隔。

LR "name=\"uuid\" value=\"" "\""

这个在正则表达式上失败。

LR "<span class=\"pointsNormal\">" "<" ->

正如你所看到的,这个在字符串的左侧有一个空格,在“span”之后。

    def parseLR(self, line) -> None:
        
        line = line.split("LR ")[1].split(" ->")[0]

        left = ""
        seen = 0
        encountered = False

        for x in range(len(line)):

            char = line[x]

            if encountered and seen % 2 == 0:
                break

            if char == '"' and line[x - 1] != '\\':
                seen += 1

            elif char == " ":
                encountered = True
            
            left += char
        
        print(left)

这是我目前的方法。我逐个字符检查,在每个字符检查中,我检查它是否是“,如果是这样,我递增看到的计数器,如果不是,我检查字符是否是空格,如果是,我设置为 True。然后不管怎样,我检查 seen 是否意味着字符串中有相等数量的 “,以及是否遇到了空格。如果是这样,那就是 LEFT 字符串的末尾。如果运行它,您将看到发生的问题。如何从行中正确解析左字符串和右字符串?encountered

python-3.x 解析

评论

0赞 Tim Roberts 7/3/2023
您需要计算双引号,但忽略前面有反斜杠的双引号。
0赞 Noah 7/3/2023
我会测试这个。编辑:这效果很好。
0赞 OysterShucker 7/3/2023
@TimRoberts - 这实际上不适用于“重定向”示例,因为引用前有一个转义的反斜杠。更正确的说法是,它应该在前面有未转义的引号的空格上拆分,但这变得更加复杂。
0赞 Tim Roberts 7/3/2023
是的,更准确的陈述是“您需要处理反斜杠转义”。
0赞 OysterShucker 7/3/2023
@TimRoberts - 呵呵,当我编辑我的说它时,你也说了同样的话。我认为我的替换/拆分方法是最简单的方法。它适用于发布的所有案例......

答:

1赞 OysterShucker 7/3/2023 #1

下面应该拆分前面有不转义的双引号的空格上的任何字符串。为清楚起见,已发表评论。

file = r'''
LR "name=\"uuid\" value=\"" "\"" ->
LR "redirect\":\"\\" "\"" ->
LR "[{'userLevel': '" "'" ->
LR "<span class=\"pointsNormal\">" "<" ->
'''

def splitdata(line:str) -> tuple:
    for i, c in enumerate(line):
        #create a cache of the last 3 characters, pad if necessary
        cache = line[max(0, i-3):i].rjust(3, " ")
        
        #if this character is not a space preceded by a double quote, skip
        if not (c==' ' and cache[-1]=='"'): continue
        
        #if the quote is not escaped LR has been found
        if cache[-2] != "\\" or cache=='\\\\"': break
    
    #return LR
    return line[:i], line[i+1:]

     
for line in file.split('\n'):
    if line:
        #it's better to do this here 
        #so splitdata doesn't become specific to your file
        line = line.split('LR ')[1].split(' ->')[0]
        left, right = splitdata(line)

评论

0赞 Tim Roberts 7/3/2023
你可以分开,得到基本相同的结果。这是失败的情况:.逐个字符解析是唯一的方法。'" "'LR "left \"side\" " "right side" ->
0赞 OysterShucker 7/3/2023
@TimRoberts - 很公平。我会让我的答案更好。临时删除。