如何将 QRegularExpression 传递给 Qt::MatchRegularExpression

How QRegularExpression can be passed to Qt::MatchRegularExpression

我正在尝试 我发现的示例代码非常好。我也试图找出相同的东西来找到一个项目并滚动到它,但这次我想匹配具有 EXACT WORD 的字符串猫.

匹配示例:

为了简单起见,我只是尝试匹配字符串中的 确切单词 。以此示例代码为例:

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 SCROLL 到它

我配置了它并尝试了这段代码。我只是做了一些小改动,比如 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_()

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

Qt::MatchRegularExpression

Performs string-based matching using a regular expression as the search term. Uses QRegularExpression. When using this flag, a QRegularExpression object can be passed as parameter and will directly be used to perform the search. The case sensitivity flag will be ignored as the QRegularExpression object is expected to be fully configured. This enum value was added in 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", line 7, 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 的字符串“猫”?

根据您的指示,您要查找包含猫字的字词,所以您必须使用以下内容:

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'


另一方面,如果 objective 是搜索下一个项目,那么您必须将前一个项目的信息存储为行,并将该信息用于 select 新项目.

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)