-2

我正在尝试这个我发现的示例代码,它真的非常好。我也试图找出相同的东西来找到一个项目并滚动到它,但是这次我想匹配具有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 SCROLL

我对其进行了配置并尝试了此代码。我只是做了一些小的改动,比如将我滚动QtCore.Qt.MatchRegExpQtCore.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_()

示例 gui

现在我已经阅读了这个Qt::MatchRegularExpression 并且我希望使用它来实现我的目标,即滚动到包含"cat"的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", 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文档中的说明进行操作,以便我可以滚动到具有“cat”的EXACT WORD字符串?

4

1 回答 1

1

根据您的指示,您要查找包含单词 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)
于 2021-01-04T03:34:04.793 回答