【问题标题】:How QRegularExpression can be passed to Qt::MatchRegularExpressionQRegularExpression 如何传递给 Qt::MatchRegularExpression
【发布时间】: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,例如程序将滚动的匹配项是:cattom catdog and catsuper cat .因为有一个确切的词“猫”本身你也可以从我的正则表达式中看到我想要完成的事情,谢谢
  • @IceBear 该列表可以包含单词“cat”,但项目包含由表达式f"{i} {cat}" 组成的单词,并且在您提供的图像中清晰显示
  • 是的,是的,要显示的字符串是这样的。例如0 thundercat。当我按下按钮时,我只想做 scrollexact 单词“cat”的 string。再说一次:cat , tom cat , dog and cat, super cat & 我在想我怎么能用QRegularExpression 来做,但我很难按照文档中的说明通过它。

标签: python python-3.x pyqt5 qlistwidget qregularexpression


【解决方案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)

【讨论】:

  • 你好!感谢您的回答...让我们转到您提供的第一个代码,因为它可以工作,但我尝试过,但它只得到cat & 正如我在我试图滚动到具有 确切字猫。现在,当我将猫列表更改为喜欢这个 cats = ["thundercat","loof","tom cat","dogcat","dog and cat","super cat","lazycat"] 它应该滚动到“tom cat”,因为该字符串中有一个单独的单词“cat”......这就是为什么我的正则表达式最初是这样的 r"\b"+"cat"+"\b"因为我试图匹配该特定字符串中的确切单词 cat。
  • 请看看我的问题,因为我做了一些修改并提供了一个示例。
  • 哦,我的@eyllanesc!有效!但是我可以问为什么我这样做r'\b'+'cat'+'\b'时它不起作用。嗯,这很奇怪,我认为正则表达式在转义方面存在一些问题......这有效 r"\bcat\b" 但这不是 r'\b'+'cat'+'\b' ,我认为我一直在使用正则表达式做错了,但我更加困惑。我需要连接,因为“猫”只是一个例子,还有其他词要匹配。
  • @IceBear 你必须转义第二个“\b”:r'\b'+'cat'+r'\b'
  • 是的,这也是我现在的想法......我已经花了将近 2 个小时来解决这个问题,我猜这只是一个简单的转义问题......可以请更改正确的正则表达式,因为它被认为是答案。谢谢
猜你喜欢
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多