Python 从输入隔离字符串时转义引号
我试图解析一个文件,其中引用文件用于封装字符串。例如,文件可能包含以下行:Python 从输入隔离字符串时转义引号,python,escaping,Python,Escaping,我试图解析一个文件,其中引用文件用于封装字符串。例如,文件可能包含以下行: "\"Hello there, my friends,\" the tour guide says." me @ swap notify "I'm a dingus who wants to put a backslash at the end of my statements. \\" me @ swap notify 但它也可能包含这样的行: "\"Hello there, my frie
"\"Hello there, my friends,\" the tour guide says." me @ swap notify
"I'm a dingus who wants to put a backslash at the end of my statements. \\" me @ swap notify
但它也可能包含这样的行:
"\"Hello there, my friends,\" the tour guide says." me @ swap notify
"I'm a dingus who wants to put a backslash at the end of my statements. \\" me @ swap notify
在该示例中,引号不应转义,但应保留一个反斜杠
有什么函数可以用来提取完整的引用语句吗\n表示换行符,\r表示回车符,有时也会出现,所以我希望得到这两个,但只有在隔离了完整字符串之后
.group(1)
语法检索组。括号用于定义组,请参见
以下是一个版本,它尝试通过失败并重试,尽可能贪婪地解析字符串,直到找到匹配项,或者无法进行匹配:
import re
import ast
def match_line(line):
while line:
print "Trying to match:", line
try:
return ast.literal_eval(line)
except SyntaxError, e:
line = line[:e.offset - 1]
except ValueError: # No way it would ever match
break
return None
with open('test.txt.') as f:
for line in f:
match = match_line(line.strip())
print "Matched:", match
print
.group(1)
语法检索组。括号用于定义组,请参见
以下是一个版本,它尝试通过失败并重试,尽可能贪婪地解析字符串,直到找到匹配项,或者无法进行匹配:
import re
import ast
def match_line(line):
while line:
print "Trying to match:", line
try:
return ast.literal_eval(line)
except SyntaxError, e:
line = line[:e.offset - 1]
except ValueError: # No way it would ever match
break
return None
with open('test.txt.') as f:
for line in f:
match = match_line(line.strip())
print "Matched:", match
print
你可以用正则表达式。不过,通常不建议将其用于解析,因为除非您有相当简单的输入或遵循严格规则的输入,否则很容易出错。 可能有某种解析模块可以更好地处理这个问题(例如,
csv
模块对于字段中的引号和转义非常有用,如果您有csv)
注意:我使用了r'xxxxx'
语法来避免进一步转义python的反斜杠(它们已经转义为正则表达式)
regex
“([^“\\]\\\)+”
表示“匹配任何不是”的内容或反斜杠,或匹配反斜杠以及紧跟其后的内容。”您可以使用regex。不过,通常不建议将其用于解析,因为除非您有相当简单的输入或遵循严格规则的输入,否则很容易出错。
可能有某种解析模块可以更好地处理这个问题(例如,csv
模块对于字段中的引号和转义非常有用,如果您有csv)
注意:我使用了r'xxxxx'
语法来避免进一步转义python的反斜杠(它们已经转义为正则表达式)
regex
“([^“\\]\\\)+”
表示“匹配任何不是”的内容或反斜杠,或匹配反斜杠以及紧跟其后的任何内容。”您对该模块不了解吗?在这里可能有用。@NiklasB。对于OP发布的特定任务,shlex
似乎有点过头了……你不知道这个模块吗?在这里可能有用。@NiklasB。对于OP发布的特定任务,shlex
似乎有点过头了……既然literal\u eval
在这里更合适,为什么还要提到eval
?而且,“解析出字符串解析”实际上是最难的部分(使用shlex
:shlex.split(s.strip())[0]
)。那么,就不再涉及eval
ing了。@NiklasB。因为在写答案时,我记不起ast.literal\u eval的确切包名和函数名(显然历史上看不到第一篇文章…)。此外,使用正则表达式对行的后半部分进行解析似乎很简单,请参见更新的答案。嘿,这似乎有效!不过,我对正则表达式有点困惑。这两个正则表达式实际上在做什么?对不起,粘贴时出错了。第一个已经过时了。既然literal\u eval
在这里更合适,为什么还要提到eval
呢?而且,“解析出字符串解析”实际上是最难的部分(使用shlex
:shlex.split(s.strip())[0]
)。那么,就不再涉及eval
ing了。@NiklasB。因为在写答案时,我记不起ast.literal\u eval的确切包名和函数名(显然历史上看不到第一篇文章…)。此外,使用正则表达式对行的后半部分进行解析似乎很简单,请参见更新的答案。嘿,这似乎有效!不过,我对正则表达式有点困惑。这两个正则表达式实际上在做什么?对不起,粘贴时出错了。第一个已经过时了。这个似乎对我最合适。正则表达式是有意义的,我需要它做什么就做什么,看起来它在我所有的情况下都能工作。我会再检查几件事,但这件应该行得通。这件似乎对我最合适。正则表达式是有意义的,我需要它做什么就做什么,看起来它在我所有的情况下都能工作。我会再检查几件事,但这应该行得通。