2014-01-17 80 views
2

剛剛遇到一行強制用戶輸入到對話框字段的代碼。不管輸入的唯一IP格式將在年底如被允許:在Python中自定義驗證器的正則表達式

123.456.789.100

regexIP=QtCore.QRegExp("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}") 

我想編寫lineedit驗證一個正則表達式,將自動替換所有的空格,逗號,句號,短劃線,小寫字母,美元符號(除字母和數字之外的所有字符),下劃線。 我也想大寫前三個字母,然後在它們後面插入一個下劃線,不管用戶輸入什麼內容。

例如,如果一個用戶類型:

this is a beautiful day 77 

正則表達式驗證器會自動將其更改爲:

THI_Sis_a_beatiful_day_77 

她是代碼的PyQt的部分看起來像:

my_regex = QtCore.QRegExp("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}") 

my_QLineEdit = QtGui.QLineEdit() 

my_validator = QtGui.QRegExpValidator(my_regex, my_QLineEdit) 

my_QLineEdit.setValidator(my_validator) 

再一次,上面的代碼只是一個例子。我要的是寫一個正則表達式來把它放在括號內:

my_regex = QtCore.QRegExp(my_regex_expression_goes_here

這my_regex表達式將強制該用戶從未進入white_space,句號,逗號,美元符號到文本字段(lineedit)。理想情況下,我想先大寫前三個字母,然後加上下劃線。但這不再是一個大問題。讓我們專注於如何實現一些基本的正則表達式,以便用戶不能放置空格,減號,美元符號等。只有字母和數字是允許的......

+0

你有一些代碼可以顯示嗎? – Toto

+0

以下是您可以用於第一部分的RegEx,以匹配您想要的:'[^ a-zA-Z0-9] +?'。然後用'_'替換。 – tenub

+0

你確定你想要的結果不是:'THI_s_is_a_beautiful_day_77'而不是你寫的東西嗎? –

回答

5

QRegExpValidator這個類不適合你的用例。

相反,您應該子類QValidator並重新實​​施其validate方法以獲得所需的行爲。

下面的腳本提供了一個基本的演示。它會自動大寫前三個字母並插入下劃線(如有必要)。此外,所有非字母數字字符都會自動替換爲下劃線。如果您希望將非字母數字字符的運行替換爲單個下劃線,請將「+」添加到正則表達式的末尾。粘貼的文字也會自動轉換。

import sip, re 
sip.setapi('QString', 2) 
from PyQt4 import QtCore, QtGui 

class Validator(QtGui.QValidator): 
    def __init__(self, parent=None): 
     super(Validator, self).__init__(parent) 
     self._replace = re.compile(r'[^A-Za-z0-9]').sub 

    def validate(self, string, pos): 
     string = self._replace('_', string) 
     prefix = string[:3].upper() 
     if len(string) > 3 and not string[3] == '_': 
      prefix += '_' 
      pos += 1 
     string = prefix + string[3:] 
     return QtGui.QValidator.Acceptable, string, pos 

class Window(QtGui.QWidget): 
    def __init__(self): 
     QtGui.QWidget.__init__(self) 
     self.edit = QtGui.QLineEdit(self) 
     self.validator = Validator(self) 
     self.edit.setValidator(self.validator) 
     layout = QtGui.QVBoxLayout(self) 
     layout.addWidget(self.edit) 

if __name__ == '__main__': 

    import sys 
    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    window.setGeometry(500, 300, 500, 100) 
    window.show() 
    sys.exit(app.exec_()) 
0

我會對此使用兩個替換:

s = 'this is a beautiful day 77' 
s = re.sub('[^a-zA-Z0-9]', '_', s) 
s = re.sub('^.{3}', lambda match: match.group(0).upper() + '_', s) 
+0

我必須在類似於我發佈的示例的語法中使用正則表達式:regexIP = QtCore.QRegExp(「\ d {1,3} \。\ d {1,3} \。\ d {1,3} \」。 \ d {1,3}「) – alphanumeric

+0

嗨,Sputnix,我真的不明白。如果你只有數字('\ d'只會*匹配數字),大寫的東西在哪裏進入? –

+0

這只是一個例子:regexIP = QtCore.QRegExp(「\ d {1,3} \。\ d {1,3} \。\ d {1,3} \。\ d {1,3}」) 。這與我想用我的正則表達式實現的內容無關。 – alphanumeric