在python中,如何将字符串与可能以#字符开头的QRegExp匹配?

时间:2017-10-10 14:14:39

标签: python regex pyqt

我试图突出显示字符串中出现的某个单词,但这个单词可以更改,并且可以包含字母数字字符,以及类似#'#',&#39 ; $',' - ',' _'。

现在我有这个:

pattern = "\\b" + QRegExp.escape(word) + "\\b"
regex = QRegExp(pattern)
index = regex.indexIn(self.edit_box.toPlainText(), pos)

然后通过使用某种背景颜色移动光标,根据起始索引和所选单词的长度突出显示。

以下情况存在问题:

sentence = "#ff0000 hey this is a test #ff0000"
word = "#ff0000"
pattern = "\\b" + QRegExp.escape(word) + "\\b"
regex = QRegExp(pattern)
pos = 0
index = regex.indexIn(sentence, pos)
while (index != -1):
     print 'this is entered'
print 'done!'

output: done!

似乎是一个领先的'#'可能只是将正则表达式模式视为注释,即使使用QRegExp.escape()也是如此。

1 个答案:

答案 0 :(得分:2)

使用#模式时,您需要在\b#ff000\b之前显示单词char。一般来说,\b word boundaries是依赖于上下文的,因此,只要您的搜索词是动态的并且可能包含特殊字符,您就需要考虑使用替代字符。

如果您只想阻止在搜索词之前和之后出现任何字词字符,请使用

pattern = "(?:^|\\W)(" + QRegExp.escape(word) + ")(?!\\w)"

如果您只想在空格和字符串的开头/结尾之间匹配搜索词,请使用

pattern = "(?:^|\\s)(" + QRegExp.escape(word) + ")(?!\\S)"

要获得正确的索引,在检查是否与rx.indexIn匹配后,您可以使用regex.pos(1)获得第1组匹配的必要索引。