1

最近我一直在研究一个 PyQt 程序。一开始我使用python re模块来处理正则表达式,但是python字符串和QString之间的转换让我很困惑。所以我试图改变QRegExp。

但是,我想使用python re的IGNORECASE、MULTILINE、DOTALL。我找到了 QRegExp.setCaseSensitivity() 来替换 re.I,但我找不到其余两个功能。有人可以帮忙吗?

或者告诉我如何将 QString 转换为 python 字符串?正则表达式模式和数据都是由用户输入的,因此它们的类型是 QString。

4

2 回答 2

2

Qt 的 QRegExp 类完全没问题,但是 python 的 re 模块要灵活得多。一般的字符串处理也是如此——如果你需要在 PyQt 程序中进行大量的字符串处理,如果可以的话,通常最好在 python 中完成。

转换 QString 非常简单。在python2中,你只需要这样做:

string = unicode(qstring)

而且通常不需要将其转换回来:任何需要 QString 的 Qt api 都将由 PyQt 自动从 python 字符串转换。

一个更通用的 QString 转换解决方案是使用sip 模块在全局基础上进行转换(无论在哪里安装 PyQt,它都应该已经可用)。这需要在 PyQt 程序的开头,在导入任何 PyQt 模块之前完成,如下所示:

import sip
sip.setapi('QString', 2)

from PyQt4 import QtCore, QtGui

这样做之后,任何通常返回 QString 的 Qt API 都将返回一个 python unicode 对象。有关此功能的更多信息,请参阅PyQt 文档中的选择不兼容的 API

尽管最初可能需要更多的工作,但从长远来看,走这条路可能是最好的。一方面,如果您需要的话,它将使移植到 python3 更容易。对于 python3,默认选择版本 2 API,因此setapi不需要上述步骤。

于 2013-12-18T19:27:15.030 回答
0

只是为了在这方面发布答案......

在我使用过的大多数情况下,"(.*?)"当涉及到 QRegExp() 时,DOTALL 方法似乎不匹配任何东西。

但是,这是我在几乎所有情况下都适用于匹配三引号字符串的东西:

单:"[^#][uUbB]?[rR]?(''')[^']*(''')"
双:'[^#][uUbB]?[rR]?(""")[^"]*(""")'

唯一不起作用的情况:''' ' '''""" " """.
我现在能找到的最好的东西......

编辑:
如果我没有这些作为停止字符,它会继续匹配文档的其余部分。

于 2015-09-19T17:52:45.647 回答