ACa*_*ter 1 python syntax-highlighting python-idle
证明点http://adams-site.x10.mx/v/python.png
您会注意到在此图像中,两个打印语句是不同的颜色.
这并不重要,我并不是真的很烦,但我觉得知道原因会很好,或者这只是一个错误.
(我看过这个链接,但我真的很想知道原因.)
这是负责ColorDelegator.py语法高亮的代码:
def any(name, alternates):
"Return a named group pattern matching list of alternates."
return "(?P<%s>" % name + "|".join(alternates) + ")"
def make_pat():
kw = r"\b" + any("KEYWORD", keyword.kwlist) + r"\b"
builtinlist = [str(name) for name in dir(__builtin__)
if not name.startswith('_')]
# self.file = file("file") :
# 1st 'file' colorized normal, 2nd as builtin, 3rd as string
builtin = r"([^.'\"\\#]\b|^)" + any("BUILTIN", builtinlist) + r"\b"
comment = any("COMMENT", [r"#[^\n]*"])
sqstring = r"(\b[rRuU])?'[^'\\\n]*(\\.[^'\\\n]*)*'?"
dqstring = r'(\b[rRuU])?"[^"\\\n]*(\\.[^"\\\n]*)*"?'
sq3string = r"(\b[rRuU])?'''[^'\\]*((\\.|'(?!''))[^'\\]*)*(''')?"
dq3string = r'(\b[rRuU])?"""[^"\\]*((\\.|"(?!""))[^"\\]*)*(""")?'
string = any("STRING", [sq3string, dq3string, sqstring, dqstring])
return kw + "|" + builtin + "|" + comment + "|" + string +\
"|" + any("SYNC", [r"\n"])
Run Code Online (Sandbox Code Playgroud)
它构建了一个大的正则表达式,用于将项目与颜色匹配.特别是,定义为的正则表达式kw将匹配源文件中找到的关键字(由关键字模块定义),而定义为的正则表达式builtin将匹配内置(通过扫描发现__builtin__),只要它不遵循句号,引号,双引号,反斜杠或哈希符号.
现在,有一些因素可以解决你看到的奇怪行为.首先,在Python 2.7 print中,它既是关键字又是内置函数.(我不知道为什么,但我想可能是接近Python 3.0,print这显然是内置而不是关键字.)因此构造了一个可以将print作为关键字或内置匹配的正则表达式.但为什么它有时会匹配为一个而有时与另一个匹配?
不同之处在于正则表达式的构建.在行的开头,kw正则表达式匹配第一个字符,并且匹配之前可以考虑其余字符.但是,在行开始之后,builtin正则表达式实际上与之前的字符匹配,因为它查找的第一个字符是"任何不是句点,引号,双引号,反斜杠或哈希的字符".即使该字符未包含在标记组中,它仍然是匹配的一部分.因此,print当前面有空格或制表符时,builtin正则表达式首先匹配.
解决这个问题的一种方法是使用负面的lookbehind断言,但是这种复杂的正则表达式已经让我有点紧张,而且我不确定哪些正则表达式功能会导致灾难性的性能下降.一个更简单的解决方法是在构造正则表达式之前过滤掉任何也是关键字的内置函数,这正是在Python 3.2.2中所做的,正如从您引用的问题链接的错误报告中所描述的那样.
| 归档时间: |
|
| 查看次数: |
3112 次 |
| 最近记录: |