所以我正在为python中的C语言子集编写一个简单的词法分析器。我正在使用 re 来匹配和查找我的所有令牌,但字符串文字标记匹配遇到问题。为了匹配我的字符串文字,我正在使用:r'(?<=").*(?=")
我这样做是非包容性的,因为我想将我的双引号作为引号标记匹配,将它们之间的内容作为字符串文字标记进行匹配。如果字符串文字在一行中仅使用一次,它可以正常工作,但是如果我这样做"hello" int i "what is up"
我最终会正确匹配hello
但随后会匹配int i
因为它也在双引号之间。我怎样才能防止这种情况。现在,我的所有输入都立即读入一行。
编辑:我发现了我可能的问题。我正在使用贪婪的表达式.*
将其切换到.*?
并且它匹配正确。它开始匹配为hello" int i "what is up
,这就是发现它贪婪的地方。我的新正则表达式是:r'(?<=").*?(?=")
现在有人看到任何可能的冲突吗?
您可以尝试以下方法(这将消耗最后一个"
,以便它不会启动新的捕获,而不是使用前瞻
import re
text = '"hello" int i "what is up"'
print(re.findall(r'"(.*?)"', text))
# ['hello', 'what is up']