QSortFilterProxyModel中的QRegExp - 查找列表中的所有项
我在使用PyQt的时候,遇到了一个问题,就是在用QSortFilterProxyModel时,使用setFilterRegExp()这个方法。我的源模型输出的是1到30的整数,而QSFPM的目的是过滤这些数字,只留下我提供的列表中的数字。
proxy.setFilterRegExp(QRegExp('^%s{1,1}%' % sourceModel.wantedNumbersList()))
如果手动输入想要的数字:
proxy.setFilterRegExp(QRegExp('^[2, 3, 4, 5, 8, 9, 10, 18, 19]{1,1}%'))
最后的结果是只留下了[1, 2, 3, 4, 5, 8, 9]。但是我想要的数字大于等于10的却没有出现在结果里,而1却莫名其妙地被包含在内。
我还尝试了:
proxy.setFilterRegExp(RegExp('^[2|3|4|15]{1,1}$')))
结果是[1, 2, 3, 4, 5],也就是说,它把我想要的数字15理解成了1和5。
根据文档,我以为用^和$可以找到每个数字的精确匹配,但实际上却找到了所有数字的所有出现。
祝好
1 个回答
1
这里的意思是,字符类会把里面的字符当作单独的字符来处理,除非你使用了范围的写法。那么,
[2, 3, 4, 5, 8, 9, 10, 18, 19]
匹配到的内容包括:2
、,
、3
、,
(又一次)、[...]、1
、9
、,
(又一次)、1
(再一次)等等。
实际上,正则表达式应该是这样的:
proxy.setFilterRegExp(QRegExp('^(2|3|4|5|8|9|10|18|19)$'))
或者尽量简化成这样:
proxy.setFilterRegExp(QRegExp('^([234589]|1[089])$'))
我想你可能需要改变一下 sourceModel.wantedNumbersList()
的表现形式(做一些字符串处理),或者手动输入。
如果你选择用字符串处理的方法,我建议你去掉方括号,然后把逗号后面跟着的空格替换成一个竖线 |
,接着用 '^(%s)$'
来做正则匹配。