Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
335 views
in Technique[技术] by (71.8m points)

python - How QRegularExpression can be passed to Qt::MatchRegularExpression

I am trying this sample code that I found which is really really good. I am also trying to figure out the same thing to find an item and scroll to it, but this time I wanted to match the the string which has the EXACT WORD "cat".

Example matches:

  • cat

  • tom cat

  • dog and cat

  • super cat

To make it very simple I am just trying to match an exact word in a string. Take this sample code as an example:

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

if re.search(r'cat',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

But this time I am using the regular expression r'cat' to check if the string has the exact word cat AND SCROLL to it

I configured it & tried this code. I just did some minor changes like the QtCore.Qt.MatchRegExp into QtCore.Qt.MatchContains which scrolls me to the word that contains "cat".

from PyQt5 import QtCore,QtWidgets

app=QtWidgets.QApplication([])

def scroll():
    #QtCore.QRegularExpression(r''+'cat'+'')
    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

Now I have read about this Qt::MatchRegularExpression & I was hoping to use this to achieve my goal which is scroll to the string with the EXACT WORD which contains "cat". Based on the documentation it says here.

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.

I can't seem to figure this out QRegularExpression object can be passed as parameter and will directly be used to perform the search I tried multiple solutions to what it meant by the object can be passed.

Things I Experimented

1.) I tried this, however it's giving me an IndexError: list index out of range error indicating that it has not found anything. I wonder why since the regex seems correct.

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

2.) I tried this one still gives me this type of error.

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

3.) Again I tried this one but I think I got it wrong since the first parameter of the findItems function needs to be a str type.

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

How can I properly pass this QRegularExpression object as stated in the docs so that I can scroll to the string which has the EXACT WORD which is "cat"?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

According to what you indicate, you want to find the words that contain the word cat, so you must use the following:

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

Output

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

Note: r''+'cat'+'' is not r"cat" since the second is not escaped, so you must change it to r''+'cat'+r''


On the other hand, if the objective is to search for the next item then you must store the information of the previous item as the row and use that information to select the new item.

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"cat", 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)

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...