在Python中为验证器定制正则表达式
刚刚遇到一行代码,它强制用户将文本输入到对话框的字段中。无论输入如何,只允许在末尾使用IP格式,例如: 123.456.789.100在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编写一个正则表达式,它将自动用下划线替换所有空格、逗号、句点、破折号、减号、美元符号(字母和数字除外)。 我还希望将前三个字母大写,然后在它们后面插入下划线,而不管用户键入什么 例如,如果用户键入:
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}”)。它与我希望用正则表达式实现的目标无关。