在Python中为验证器定制正则表达式

在Python中为验证器定制正则表达式,python,regex,pyqt,validation,Python,Regex,Pyqt,Validation,刚刚遇到一行代码,它强制用户将文本输入到对话框的字段中。无论输入如何,只允许在末尾使用IP格式,例如: 123.456.789.100 regexIP=QtCore.QRegExp("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}") 我想为lineedit validator编写一个正则表达式,它将自动用下划线替换所有空格、逗号、句点、破折号、减号、美元符号(字母和数字除外)。 我还希望将前三个字母大写,然后在它们后面插入下划线,而不管用户键入什么 例如,如果用户键入:

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

123.456.789.100

regexIP=QtCore.QRegExp("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")
我想为lineedit validator编写一个正则表达式,它将自动用下划线替换所有空格、逗号、句点、破折号、减号、美元符号(字母和数字除外)。 我还希望将前三个字母大写,然后在它们后面插入下划线,而不管用户键入什么

例如,如果用户键入:

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_表达式在这里


此my_regex表达式将强制用户从不在文本字段(lineedit)中输入空格、句点、逗号和美元符号。理想情况下,我希望将前三个字母大写,然后加下划线。但这已经不是什么大问题了。让我们集中讨论如何实现一些基本的正则表达式,这样用户就不能使用空格、减号、美元符号等。只允许使用字母和数字……

对此,我将使用两种替换:

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)

QRegExpValidator
类并不真正适合您的用例

相反,您应该子类化
QValidator
,并重新实现其方法以获得您想要的行为

下面的脚本提供了一个基本的演示。它会自动将前三个字母大写,并插入下划线(如有必要)。此外,所有非字母数字字符将自动替换为下划线。如果要将非字母数字字符的运行替换为单个下划线,请在regexp的末尾添加“+”。粘贴的文本也将自动转换

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

你有一些代码要显示吗?这里有一个正则表达式,你可以在第一部分使用它来匹配你想要的:
[^a-zA-Z0-9]+?
。然后用
\uu
替换。你确定你想要的结果不是:
这是美丽的一天,而不是你所写的吗?连续的非字母数字字符是否替换为一个或多个下划线?“…你确定你想要的结果不是:这是美丽的一天,而不是你写的吗?”“我们如何做到这一点?我必须使用正则表达式,语法与我发布的示例类似:regexIP=QtCore.QRegExp(“\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}”)嗨,Sputnix,我真的不明白。如果你只有数字(
\d
将只匹配数字),大写字母在哪里输入东西?这只是一个例子:regexIP=QtCore.QRegExp(“\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}”)。它与我希望用正则表达式实现的目标无关。