在Python中为Validator自定义Regex

alp*_*ric 2 python regex validation pyqt

刚刚遇到一行代码,强制用户的文本输入到对话框的字段中.无论输入如何,最终只允许使用IP格式,例如:

123.456.789.100

regexIP=QtCore.QRegExp("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")
Run Code Online (Sandbox Code Playgroud)

我想为lineedit验证器编写一个正则表达式,它将使用下划线自动替换所有空格,逗号,句点,短划线,减号,美元符号(除字母和数字之外的所有内容).我还想将前三个字母大写,然后在它们之后插入一个下划线,而不管用户输入什么.

例如,如果用户键入:

this is a beautiful day 77
Run Code Online (Sandbox Code Playgroud)

正则表达式验证器会自动将其更改为:

THI_Sis_a_beatiful_day_77
Run Code Online (Sandbox Code Playgroud)

她是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 )
Run Code Online (Sandbox Code Playgroud)

再一次,上面的代码只是一个例子.我想要的是写一个正则表达式表达式将其放在括号内:

my_regex = QtCore.QRegExp(my_regex_expression_goes_here)

此my_regex表达式将强制该用户永远不会在文本字段(lineedit)中输入white_space,句点,逗号,美元符号.理想情况下,我想将前三个字母大写,然后加下下划线.但这不再是一件大事了.让我们专注于如何实现一些基本的正则表达式,这样用户就无法放置空格,减号,美元符号等.只允许使用字母和数字....

ekh*_*oro 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_())
Run Code Online (Sandbox Code Playgroud)