如何解决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_()
现在我已经阅读了这个 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 举报,一经查实,本站将立刻删除。