2013-12-18 48 views
1

最近我一直在研究一個PyQt程序。在開始我使用python re模塊來處理正則表達式,但python字符串和QString之間的轉換讓我感到困惑。所以我試圖改變QRegExp。QRegExp可以做MULTILINE和DOTALL匹配嗎?

但是,我想使用IGNORECASE,MULTILINE,DOTALL的Python重新。我找到了QRegExp.setCaseSensitivity()來替換re.I,但是我找不到其餘的兩個特性。任何人都可以幫忙嗎?

或者告訴我如何將QString轉換爲python字符串?正則表達式模式和數據都是由用戶輸入的,因此它們的類型是QString。

+0

請注意底部是否爲此頁面:http://qt-project.org/doc/qt-4.8/qregexp.html QRegexp不能很好地處理多行模式。 – Stephan

回答

2

Qt的QRegExp類完全沒問題,但是python的re模塊更加靈活。一般情況下,字符串處理也是如此 - 如果你需要在PyQt程序中進行大量的字符串處理,通常最好在python中完成,如果可以的話。

轉換QString很容易。在python2,你只需要做:

string = unicode(qstring) 

而且通常有沒有必要將其轉換回:任何Qt的API,需要爲QString會從PyQt的一個Python字符串被自動轉換。

更通用的QString轉換解決方案是使用sip module(在PyQt安裝的位置應該已經可用)在全球範圍內完成。這需要在你的PyQt程序的開始做,任何PyQt的模塊都是進口之前,像這樣:

import sip 
sip.setapi('QString', 2) 

from PyQt4 import QtCore, QtGui 

這樣做了以後,任何的Qt的API,通常會返回的QString會返回一個Python的Unicode對象代替。有關此功能的更多信息,請參閱PyQt文檔中的Selecting Incompatible APIs

雖然最初可能需要多一點工作,但從長遠來看,採用這條路線可能是最好的。首先,如果你需要這樣做的話,它將使得移植到python3更容易。對於python3,默認情況下選擇版本2 API,因此不需要上述setapi步驟。

0

只是張貼在事這邊的答案...

在我合作過大多數情況下,DOTALL "(.*?)"做法似乎​​並不匹配任何當談到QRegExp()。

然而,這裏是我使用的東西,匹配三引號字符串工作在幾乎所有的案件:

單:"[^#][uUbB]?[rR]?(''')[^']*(''')"
雙:'[^#][uUbB]?[rR]?(""")[^"]*(""")'

唯一的情況下不工作:''' ' '''""" " """。我能找到現在
最好的事情...

編輯:
如果我沒有這些作爲終止字符,它繼續通過文檔的其餘部分相匹配。