[英]Parsing in Python: what's the most efficient way to suppress/normalize strings?
我正在解析源文件,并且想“抑制”字符串。 我的意思是将每个字符串(例如“ bla bla bla + / *”)转换为“ string”(确定性),并且不包含任何可能使我的解析器困惑的字符,因为我不在乎字符串。 这里的问题之一是使用“%s”等格式的字符串格式化,请参阅下面有关此内容的评论。
以下面的伪代码为例,它可能是我正在解析的文件的内容。 假设字符串以“开头,而转义”字符则以“”完成:
print(i)
print("hello**")
print("hel"+"lo**")
print("h e l l o "+
"hello\n")
print("hell""o")
print(str(123)+"h e l l o")
print(uppercase("h e l l o")+"g o o d b y e")
应转换为以下结果:
print(i)
print("string")
print("string"+"string")
print("string"
"string")
print("string")
print(str(123)+"string")
print(uppercase("string")+"string")
目前,我将其视为代码中的一种特殊情况(即,检测字符串的开头,并在途中以若干次特殊情况“手动”运行至其结尾)。 如果有我可以使用的Python库函数或一个不错的正则表达式,它可以使我的代码更高效,那就太好了。
几句话:
选项1:要清除Python源代码,请尝试使用内置的tokenize模块。 它可以在任何Python源文件中正确找到字符串和其他标记。
选项3:将pygments与HTML输出一起使用,并用"string"
替换蓝色(等)中的任何内容。 pygments支持几十种语言。
选项2:对于大多数语言,您可以构建自定义的正则表达式替换。 例如,以下代码清除了Python源代码(但如果源文件包含"""
或'''
则它不起作用):
import re
sanitized = re.sub(r'(#.*)|\'(?:[^\'\\]+|\\.)*\'|"(?:[^"\\]+|\\.)*"',
lambda match: match.group(1) or '"string"', source_code)
即使字符串包含反斜杠( \\"
, \\\\
, \\n
, \\\\
, \\\\"
, \\\\\\"
等都可以正常工作),上述regexp也可以正常工作。
在构建正则表达式时,请确保匹配注释(以便您的正则表达式替换不会触及注释中的字符串)和正则表达式文字(例如,在Perl,Ruby和JavaScript中),并注意正确匹配反斜杠和换行符(例如,在Perl和Ruby中,字符串可以包含换行符)。
为每种语言使用专用的解析器 -特别是因为人们已经为您完成了这项工作。 您提到的大多数语言都有语法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.