2017-10-10 134 views
0

我想突出顯示出現在字符串中的某個單詞,但這個單詞可以更改,並可以以字母數字字符以及'#','$',' - '和'_' 。在Python中,如何匹配可能以#字符開頭的QRegExp字符串?

現在我有這樣的:

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()。

+3

單詞邊界是單詞字符(字母,數字,下劃線)與非單詞字符(其他所有內容)或字符串的開始/結尾之間的邊界。空格和#都是非單詞字符。您可以使用lookarounds構建自定義邊界,例如'(?<!\ w)#ff0000(?!\ w)'。 –

+1

我不認爲[QRegExp](http://doc.qt.io/qt-4.8/qregexp.html)支持lookbehind。我猜''pattern =「(?:^ | \\ W)(」+ QRegExp.escape(word)+「)(?!\\ w)」'會在這裏做,只是應該採用組1的索引, 'regex.pos(1)'。 –

+1

@WiktorStribiżew似乎是如此,那麼使用替代和重新安排索引的替代方案已經在您的答案中。 –

回答

2

使用\b#ff000\b模式時,您需要一個字符字符出現在#之前。一般來說,\b word boundaries是依賴於上下文的,因此,只要您的搜索詞是動態的並且可能包含特殊字符,就需要考慮使用替代方法。

如果你只是想阻止任何單詞字符之前,檢索詞後出現,使用

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

如果你只想在空格之間的匹配搜索詞,並開始/字符串的結尾,使用

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

爲了得到正確的索引,檢查是否有與rx.indexIn比賽後,你可能會使用regex.pos(1)第1組比賽的必要指標。

+0

這種情況下的正則表達式是什麼?當您撥打regex.pos {1}時 – Ajv2324