如何将 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)
我正在尝试
匹配示例:
猫
汤姆猫
狗和猫
超级猫
为了简单起见,我只是尝试匹配字符串中的 确切单词 。以此示例代码为例:
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)