【发布时间】:2021-04-09 22:06:30
【问题描述】:
我正在尝试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", 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 即 "cat" 的字符串>?
【问题讨论】:
-
我不能按我应该的方式测试你的代码,因为我还不能安装 Qt 5.15,但是:1) 也应该在正则表达式的最后一位使用
r前缀(同样适用于点3个); 2)MatchRegularExpression是一个枚举值,值是不可调用的:你可以使用QtCore.Qt.MatchFlag(QtCore.Qt.MatchRegularExpression)创建标志 -
@IceBear 你的问题不清楚。我没有看到任何包含完全“cat”的项目,最接近的项目是带有文本“1 cat”的项目,您要搜索带有文本“foo_number cat”的项目吗?
-
@eyllanesc 我想我已经解释得对了......你可以看到那里的代码有一个
list变量cats我还包括了一个我提到的示例匹配。如果我放置标志QtCore.Qt.MatchContains,程序会滚动到包含“cat”的ITEM。现在我想做的是带有单词“cat”的 EXACT WORD,例如程序将滚动的匹配项是:cat、tom cat、dog and cat、super cat.因为有一个确切的词“猫”本身你也可以从我的正则表达式中看到我想要完成的事情,谢谢 -
@IceBear 该列表可以包含单词“cat”,但项目包含由表达式
f"{i} {cat}"组成的单词,并且在您提供的图像中清晰显示 -
是的,是的,要显示的字符串是这样的。例如
0 thundercat。当我按下按钮时,我只想做 scroll 到 exact 单词“cat”的 string。再说一次:cat , tom cat , dog and cat, super cat& 我在想我怎么能用QRegularExpression来做,但我很难按照文档中的说明通过它。
标签: python python-3.x pyqt5 qlistwidget qregularexpression