正则表达式的python字符串

时间:2014-02-12 19:53:51

标签: python regex string

我想知道你可以使用什么正则表达式来解析python字符串。几次失败之后,我找到了一个正则表达式代码,它可以解析一种最常用的字符串格式,比如

"this is \"my string\", which ends here"

这是我的正则表达式 - “代码”:

"([^"\\]|(\\.))*"

我问了这个问题,因为我以前在互联网上找不到类似的东西。我可以使用该表达式并“开发”它来解析所有类型的python字符串吗?如果你发现这个问题很有意思并I recommend you,你可以在那里快速检查你的表达。

3 个答案:

答案 0 :(得分:2)

如果在引号前有一个奇数> 1的反斜杠,你的正则表达式模式(以及@thebjorn链接中的那个)将会失败,我建议你使用这种模式(使用单行模式):

"(?:[^"\\]|\\{2}|\\.)*"

优化方式:

"(?:(?=([^"\\]+|\\{2}|\\.))\1)*"

也要处理单引号:

(["'])(?:[^"'\\]|\\{2}|\\.|(?!\1)["'])*\1

(["'])(?:(?=([^"'\\]+|\\{2}|\\.|(?!\1)["']))\2)*\1

(请注意,四个模式的最后一个字符完全在同一行,一个符号?)

答案 1 :(得分:2)

这是一种不同的方法,它使用tokenize.generate_tokens来识别Python字符串。 tokenize模块使用正则表达式;所以通过使用tokenize,您可以将复杂的脏工作留给Python本身。通过使用更高级别的功能,您可以更加确信正则表达式是正确的(并避免重新发明轮子)。此外,这将正确识别所有种类的Python字符串(例如单引号,双引号和三引号的字符串),而不会被评论混淆。

import tokenize
import token
import io
import collections

class Token(collections.namedtuple('Token', 'num val start end line')):
    @property
    def name(self):
        return token.tok_name[self.num]

text = r'''foo = 1 "this is \"my string\", which ends here" bar'''

for tok in tokenize.generate_tokens(io.BytesIO(text).readline):
    tok = Token(*tok)            # 1
    if tok.name == 'STRING':     # 2
        print(tok.val)
  1. tokenize.generate_tokens返回元组。 Token类允许你 以更好的方式访问元组中的信息。
  2. 特别是,每个令牌都有一个名称,例如'STRING','NEWLINE', 'INDENT'或'OP'。您可以使用它来识别Python字符串。

  3. 编辑:我喜欢使用Token类,所以我不必写 许多地方token.tok_name[num]。但是,对于上面的代码,忘记Token类可能更清晰,更容易,只是明确地写出主要想法:

    import tokenize
    import token
    import io
    
    text = r'''foo = 1 "this is \"my string\", which ends here" bar'''
    
    for num, val, start, end, line in tokenize.generate_tokens(io.BytesIO(text).readline):
        if token.tok_name[num]  == 'STRING': 
            print(val)
    

答案 2 :(得分:1)

这似乎正确处理了一切:

rr = r'''(?xi)
        (r|u|ru|ur|)
        (
            ''\' (\\. | [\s\S])*? ''\'
            |
            """ (\\. | [\s\S])*? """
            |
            ' (\\. | [^'\n])* '
            |
            " (\\. | [^"\n])* "
        )
'''

测试:https://ideone.com/DEimLl

语法参考:http://docs.python.org/3/reference/lexical_analysis.html#string-and-bytes-literals