Может ли QRegExp совпадать с MULTILINE и DOTALL?

Недавно я работал над программой PyQt. Вначале я использовал модуль python re для обработки регулярного выражения, но преобразование между строкой python и QString сбивает меня с толку. Поэтому я попытался изменить QRegExp.

Однако я хочу использовать IGNORECASE, MULTILINE, DOTALL для python re. Я нашел QRegExp.setCaseSensitivity() для замены re.I, но не могу найти две остальные функции. Кто-нибудь может помочь?

Или подскажите, как преобразовать QString в строку python? И шаблон регулярного выражения, и данные вводятся пользователем, поэтому их типы — QString.


person Kill Console    schedule 18.12.2013    source источник
comment
Обратите внимание внизу, если эта страница: qt-project.org/doc/qt- 4.8/qregexp.html, что QRegexp плохо обрабатывает многострочные шаблоны.   -  person Stephan    schedule 18.12.2013


Ответы (2)


С классом QRegExp в Qt все в порядке, но модуль re в python гораздо более гибкий. И то же самое касается обработки строк в целом — если вам нужно выполнить большую обработку строк в программе PyQt, часто лучше всего сделать это на python, если вы можете.

Преобразование QString довольно просто. В python2 вам просто нужно сделать:

string = unicode(qstring)

И обычно нет необходимости преобразовывать его обратно: любой API Qt, для которого требуется QString, будет автоматически преобразован из строки python с помощью PyQt.

Более общим решением для преобразования QString является глобальное преобразование с использованием sip-модуля (который уже должен быть доступен везде, где установлен PyQt). Это необходимо сделать в начале вашей программы PyQt, прежде чем любой из модулей PyQt будет импортирован, например:

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

from PyQt4 import QtCore, QtGui

После этого любой API Qt, который обычно возвращает QString, вместо этого будет возвращать объект unicode python. Дополнительные сведения об этой функции см. в разделе Выбор несовместимых API в документы PyQt.

Хотя поначалу это может потребовать немного больше работы, выбор этого пути, вероятно, будет лучшим в долгосрочной перспективе. Во-первых, это упростит перенос на python3, если вам когда-нибудь понадобится это сделать. Для python3 по умолчанию выбирается API версии 2, поэтому указанный выше шаг setapi не требуется.

person ekhumoro    schedule 18.12.2013

Просто, чтобы опубликовать ответ на эту сторону вещей...

В большинстве случаев, с которыми я играл, подход DOTALL "(.*?)", похоже, ничему не соответствует, когда дело доходит до QRegExp().

Однако вот что я использую, что работает почти во всех моих случаях для сопоставления строк в тройных кавычках:

одинарный: "[^#][uUbB]?[rR]?(''')[^']*(''')"
двойной: '[^#][uUbB]?[rR]?(""")[^"]*(""")'

Единственные случаи, которые не работают: ''' ' ''' и """ " """.
лучшее, что я смог найти на данный момент...

РЕДАКТИРОВАТЬ:
если у меня нет их в качестве стоп-символов, они продолжают совпадать с остальной частью документа.

person Tcll    schedule 19.09.2015