排除包含我的正则表达式但不是我的正则表达式的单词

时间:2014-12-20 17:25:34

标签: regex search python-3.x tkinter

我试图找到一种方法来排除包含我的正则表达式的单词,但不是使用search小部件对象的Text方法的正则表达式。例如,假设我有这个正则表达式"(if)|(def)",而definedefinitionelif这样的单词都是re.search函数找到的,但我想要一个正则表达式,只找到ifdef

这是我正在使用的代码:

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",则它不会突出显示任何内容,您可以看到,如果您在函数中放置了一个打印件,那么它就是一个空字符串。

3 个答案:

答案 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了解详情。