提问人:Noah 提问时间:7/3/2023 最后编辑:Noah 更新时间:7/4/2023 访问量:68
尝试使用 python 逐个字符解析一行
Attempting to parse a line, character by character using python
问:
我有一条线,根据输入的不同,它看起来会有所不同。我目前不起作用的方法是使用它循环它,这样我就可以得到当前位置。
该行由单词“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
答:
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 - 很公平。我会让我的答案更好。临时删除。
评论