【发布时间】:2009-05-11 05:55:03
【问题描述】:
我正在解析一个源文件,我想“抑制”字符串。我的意思是将每个字符串(如“bla bla bla +/*”)转换为“字符串”之类的确定性且不包含任何可能混淆我的解析器的字符,因为我不关心字符串。这里的问题之一是使用例如字符串格式化。 “%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 库函数或一个不错的正则表达式可以使我的代码更高效,那就太好了。
几点说明:
- 我希望“字符串开头”字符是一个变量,例如' 与 "。
- 在这个阶段我不解析 Python 代码,但我计划这样做,问题显然变得更加复杂,因为字符串可以以多种方式开始,并且必须以与开始相对应的方式结束。我现在不打算处理这个问题,但如果有任何成熟的最佳实践,我想知道它。
- 关于这种“抑制”,最困扰我的是字符串格式化与“%s”之类的情况,它们是有意义的标记。我目前没有处理这个问题,也没有完全考虑清楚,但是如果你们中的任何人对如何处理这个问题有任何建议,那就太好了。请注意,我对字符串内标记的特定类型或格式不感兴趣,我知道字符串中有标记(有多少)就足够了。此处可能很重要的注释:我的标记器没有嵌套,因为我的目标很简单(我没有编译任何东西......)。
- 我不太确定起始字符串字符的转义。你会说在大多数编程语言中实现这一点的常见方式是什么?重复出现(例如“”)或任何两个字符集(例如'\"')的假设是否足以转义?我是否需要处理其他情况(想想像 Java、C/C++、PHP、C# 这样的语言)?
【问题讨论】:
-
这个问题看起来很奇怪。您是否使用正则表达式来解析 python 而不是解析器生成器(例如使用 pyparsing)?提供一些关于您正在做的事情的更大图景的见解会很有帮助。
-
我正在对多种语言的代码文件进行标记。我没有将正则表达式用于“大图”,但我确实使用了几个正则表达式来解决特定问题,例如删除 cmets,空白行等。我希望澄清一下。