【问题标题】:Customizing Regex for Validator in Python在 Python 中为验证器自定义正则表达式
【发布时间】:2014-02-07 05:02:51
【问题描述】:

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

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 表达式将强制用户永远不会在文本字段 (lineedit) 中输入空格、句点、逗号、美元符号。理想情况下,我想将前三个字母大写,然后加上下划线。但这已经不是什么大问题了。让我们专注于如何实现一些基本的正则表达式,这样用户就不能输入空格、减号、美元符号等。只允许使用字母和数字......

【问题讨论】:

  • 你有一些代码要显示吗?
  • 这是一个正则表达式,您可以将其用于第一部分以匹配您想要的内容:[^a-zA-Z0-9]+?。然后只需替换为_
  • 你确定你想要的结果不是:THI_s_is_a_beautiful_day_77而不是你写的吗?
  • 连续的非字母数字字符是否替换为一个或多个下划线?
  • "...您确定您想要的结果不是:THI_s_is_a_beautiful_day_77 而不是您所写的吗?..." 我们如何做到这一点?

标签: python regex pyqt validation


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我会为此使用两个替代品:

    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)
    

    【讨论】:

    • 我必须以类似于我发布的示例的语法使用正则表达式:regexIP=QtCore.QRegExp("\d{1,3}\.\d{1,3}\.\d {1,3}\.\d{1,3}")
    • 嗨,斯普特尼克斯,我真的不明白。如果您只有数字(\d匹配数字),那么大写在哪里输入?
    • 这只是一个例子:regexIP=QtCore.QRegExp("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d {1,3}")。它与我想用我的正则表达式实现的目标无关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 2019-08-30
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多