繁体   English   中英

在Python中解析:抑制/规范化字符串的最有效方法是什么?

[英]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库函数或一个不错的正则表达式,它可以使我的代码更高效,那就太好了。

几句话:

  • 我希望“字符串开始”字符是一个变量,例如'vs'。
  • 我目前不解析Python代码,但我打算这样做,并且问题显然变得更加复杂,因为字符串可以以多种方式开始,并且必须以与开始相对应的方式结束。 我现在不尝试处理此问题,但是如果有任何完善的最佳实践,我想了解一下。
  • 最令我困扰的是有关“抑制”的事情,例如“%s”之类的字符串格式化,这是有意义的标记。 我目前还没有处理这个问题,也没有完全考虑清楚,但是如果您有任何关于如何处理此问题的建议,那将是很棒的。 请注意,我对字符串中标记的具体类型或格式不感兴趣,足以让我知道字符串中有标记(多少个)。 在这里可能很重要:我的标记器没有嵌套,因为我的目标很简单(我没有编译任何东西...)。
  • 我不太确定起始字符串字符的转义。 您会说大多数编程语言中实现此目标的常见方式是什么? 是否假设两次出现(例如“”)或两个字符的任何集合(例如“ \\””)足以转义?我是否需要处理其他情况(例如Java,C / C ++,PHP,C#等语言) )?

选项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中,字符串可以包含换行符)。

您无处提及使用词法分析器解析器的方法 如果实际上您还没有,请查看令牌化模块(可能是您想要的)或第三方模块PLY (Python Lex-Yacc)。 您的问题需要系统的方法,这些工具(和其他工具)可以解决。

(请注意,一旦对代码进行了标记,就可以对字符串的内容应用另一个专用的标记化器,以检测诸如%s类的特殊格式设置指令。不过,在这种情况下,正则表达式可以完成此工作。)

为每种语言使用专用的解析器 -特别是因为人们已经为您完成了这项工作。 您提到的大多数语言都有语法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM