我试图找到一种方法来排除包含我的正则表达式的单词,但不是使用search
小部件对象的Text
方法的正则表达式。例如,假设我有这个正则表达式"(if)|(def)"
,而define
,definition
或elif
这样的单词都是re.search
函数找到的,但我想要一个正则表达式,只找到if
和def
。
这是我正在使用的代码:
import keyword
PY_KEYS = keyword.kwlist
PY_PATTERN = "^(" + ")|(".join(PY_KEYS) + ")$"
但是它仍然带有define
之类的字样,但即使def
包含define
,我也想要def
之类的字词。
我需要这个来强调tkinter.Text
小部件中的单词。我正在使用的函数负责突出显示代码:
def highlight(self, event, pattern='', tag=KW, start=1.0, end="end", regexp=True):
"""Apply the given tag to all text that matches the given pattern
If 'regexp' is set to True, pattern will be treated as a regular
expression.
"""
if not isinstance(pattern, str) or pattern == '':
pattern = self.syntax_pattern # PY_PATTERN
# print(pattern)
start = self.index(start)
end = self.index(end)
self.mark_set("matchStart", start)
self.mark_set("matchEnd", start)
self.mark_set("searchLimit", end)
count = tkinter.IntVar()
while pattern != '':
index = self.search(pattern, "matchEnd", "searchLimit",
count=count, regexp=regexp)
# prints nothing
print(self.search(pattern, "matchEnd", "searchLimit",
count=count, regexp=regexp))
if index == "":
break
self.mark_set("matchStart", index)
self.mark_set("matchEnd", "%s+%sc" % (index, count.get()))
self.tag_add(tag, "matchStart", "matchEnd")
另一方面,如果PY_PATTERN = "\\b(" + "|".join(PY_KEYS) + ")\\b"
,则它不会突出显示任何内容,您可以看到,如果您在函数中放置了一个打印件,那么它就是一个空字符串。
答案 0 :(得分:4)
您可以使用锚点:
"^(?:if|def)$"
^
在字符串的开头断言位置,并且$
在字符串的末尾断言位置,声明除非字符串完全是if
,否则不能再匹配任何内容def
。
>>> import re
for foo in ["if", "elif", "define", "def", "in"]:
bar = re.search("^(?:if|def)$", foo)
print(foo, ' ', bar);
... if <_sre.SRE_Match object at 0x934daa0>
elif None
define None
def <_sre.SRE_Match object at 0x934daa0>
in None
答案 1 :(得分:3)
您可以使用字边界:
"\b(if|def)\b"
答案 2 :(得分:2)
对于Python的正则表达式,给出的答案是可以的,但我发现同时tkinter search
小部件的Text
方法实际上使用了Tcl的常规表达方式。
在这种情况下,我们可以简单地使用相应的Tcl字边界字符,而不是用\b
或\\b
包装单词或正则表达式(如果我们不使用原始字符串),那是\y
或\\y
,它完成了我的工作。
观看我的other question了解详情。