我想知道你可以使用什么正则表达式来解析python字符串。几次失败之后,我找到了一个正则表达式代码,它可以解析一种最常用的字符串格式,比如
"this is \"my string\", which ends here"
这是我的正则表达式 - “代码”:
"([^"\\]|(\\.))*"
我问了这个问题,因为我以前在互联网上找不到类似的东西。我可以使用该表达式并“开发”它来解析所有类型的python字符串吗?如果你发现这个问题很有意思并I recommend you,你可以在那里快速检查你的表达。
答案 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)
编辑:我喜欢使用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])* "
)
'''
语法参考:http://docs.python.org/3/reference/lexical_analysis.html#string-and-bytes-literals