微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

QRegularExpression 如何传递给 Qt::MatchRegularExpression

如何解决QRegularExpression 如何传递给 Qt::MatchRegularExpression

我正在尝试 this 示例代码,我发现它确实非常好。我也试图找出同样的事情来找到一个项目并滚动到它,但这次我想匹配具有 EXACT WORD "cat" 的字符串>.

示例匹配:

  • 汤姆猫

  • 狗和猫

  • 超级猫

为了让它变得非常简单,我只是想在字符串中匹配一个确切的词。以这个示例代码为例:

import re
s= "1  tom cat"
s2 = "2 thundercat"

if re.search(r'\bcat\b',s2):
    print("There is an EXACT word cat in that string")
else:
    print("There is NO EXACT word cat in that string")

Input: s
Output: There is an EXACT word cat in that string

Input: s2
Output: There is NO EXACT word cat in that string

但是这次我使用正则表达式 r'\bcat\b'检查字符串是否确切词 cat AND 滚动到它

我配置了它并尝试了此代码。我只是做了一些小改动,比如将 QtCore.Qt.MatchRegExp 变成 QtCore.Qt.MatchContains,这会让我滚动到包含 "cat" 的单词。

from PyQt5 import QtCore,QtWidgets

app=QtWidgets.QApplication([])

def scroll():
    #QtCore.QRegularExpression(r'\b'+'cat'+'\b')
    item = listWidget.findItems('cat',QtCore.Qt.MatchContains)[0]
    item.setSelected(True)

window = QtWidgets.QDialog()
window.setLayout(QtWidgets.QVBoxLayout())
listWidget = QtWidgets.QListWidget()
window.layout().addWidget(listWidget)


cats = ["thundercat","cat","tom cat","dogcat","dog and cat","super cat","lazycat"]

for i,cat in enumerate(cats):
    QtWidgets.QListWidgetItem(f"{i}  {cat}",listWidget)

btn = QtWidgets.QPushButton('Scroll')
btn.clicked.connect(scroll)
window.layout().addWidget(btn)
window.show()
app.exec_()

sample gui

现在我已经阅读了这个 Qt::MatchRegularExpression 并且我希望用它来实现我的目标,即滚动到带有 EXACT WORD 的字符串,其中 包含 “猫”。基于它在这里说的文档。

Qt::MatchRegularExpression

使用正则表达式作为基于字符串的匹配 搜索词。使用 QRegularExpression。使用此标志时, QRegularExpression 对象可以作为参数传递,并且会直接 用于执行搜索。区分大小写的标志将是 忽略,因为 QRegularExpression 对象预计将完全 配置。这个枚举值是在 Qt 5.15 中添加的。

我似乎无法弄清楚 QRegularExpression object can be passed as parameter and will directly be used to perform the search 我尝试了多种解决方案来解决 object 可以传递的含义。

我实验过的东西

1.) 我试过了,但是它给了我一个 IndexError: list index out of range 错误,表明它没有找到任何东西。我想知道为什么 regex 似乎是正确的。

item = listWidget.findItems(r'\b'+'cat'+'\b',QtCore.Qt.MatchRegularExpression)[0]

2.) 我试过这个仍然给我这种类型的错误

File "finditems.py",line 7,in scroll
    item = listWidget.findItems('cat',QtCore.Qt.MatchRegularExpression(QtCore.QRegularExpression(r'\b'+'cat'+'\b')))[0]
TypeError: 'MatchFlag' object is not callable

3.) 我再次尝试了这个,但我认为我错了,因为 findItems 函数的第一个参数需要是 str 类型。

File "finditems.py",in scroll
    item = listWidget.findItems(QtCore.QRegularExpression(r'\b'+'cat'+'\b'),QtCore.Qt.MatchRegularExpression)[0]
TypeError: findItems(self,str,Union[Qt.MatchFlags,Qt.MatchFlag]): argument 1 has unexpected type 'QRegularExpression'

我如何正确pass这个QRegularExpression object如文档中所述,以便我可以滚动到具有 EXACT WORD 的字符串,即 "cat “

解决方法

根据你的指示,你想找到包含cat这个词的词,所以你必须使用以下:

items = listWidget.findItems(r"\bcat\b",QtCore.Qt.MatchRegularExpression)
for item in items:
    print(item.text())

输出

1  cat
2  tom cat
4  dog and cat
5  super cat

注意: r'\b'+'cat'+'\b' 不是 r"\bcat\b" 因为第二个 \b 没有转义,所以你必须把它改成 r'\b'+'cat'+r'\b'


另一方面,如果目标是搜索下一个项目,那么您必须将前一个项目的信息存储为行,并使用该信息选择新项目。

def scroll():
    new_item = None
    last_selected_row = -1
    selected_items = listWidget.selectedItems()
    if selected_items:
        last_selected_row = listWidget.row(selected_items[0])
    items = listWidget.findItems(r"\bcat\b",QtCore.Qt.MatchRegularExpression)
    for item in items:
        if listWidget.row(item) > last_selected_row:
            new_item = item
            break
    if new_item:
        new_item.setSelected(True)
        listWidget.scrollToItem(new_item,QtWidgets.QAbstractItemView.PositionAtTop)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?