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表示回车符,有时也会出现,所以我希望得到这两个,但只有在隔离了完整字符串之后

  • 解析出字符串部分。你可以用一个或
  • 字符串并将其分配给变量
  • 测试:

    正则表达式表示“匹配任何内容并将其存储为第1组,最多为一个空格、一个单词、一个空格、@-符号、空格和一个单词”。然后使用
    .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
    
  • 解析出字符串部分。你可以用一个或
  • 字符串并将其分配给变量
  • 测试:

    正则表达式表示“匹配任何内容并将其存储为第1组,最多为一个空格、一个单词、一个空格、@-符号、空格和一个单词”。然后使用
    .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的确切包名和函数名(显然历史上看不到第一篇文章…)。此外,使用正则表达式对行的后半部分进行解析似乎很简单,请参见更新的答案。嘿,这似乎有效!不过,我对正则表达式有点困惑。这两个正则表达式实际上在做什么?对不起,粘贴时出错了。第一个已经过时了。这个似乎对我最合适。正则表达式是有意义的,我需要它做什么就做什么,看起来它在我所有的情况下都能工作。我会再检查几件事,但这件应该行得通。这件似乎对我最合适。正则表达式是有意义的,我需要它做什么就做什么,看起来它在我所有的情况下都能工作。我会再检查几件事,但这应该行得通。