2015-09-17 5 views
2

Я пытаюсь получить регулярное выражение, чтобы соответствовать тексту между фигурными скобкамиQRegEx, чтобы выделить все между скобками

The following SO question. Дай мне начало, но это не работает для меня. И я не уверен, что я делаю неправильно. Рассмотрим следующий пример:

The {quick} brown fox {jumped over the} lazy old {dog}. While {the [0ld] man} spoke {to the} gardener. 

То, что я пытаюсь сделать, это матч весь текст между фигурными скобками, так что я могу выделить их. Выражение

\{(.*?)\} 

не работал для меня. Я не знаю, почему. Я использую python 2.10/pyqt и класс QRegExp pyqt для Windows.

Может ли кто-нибудь указать, что я делаю неправильно.

Просто чтобы добавить более подробную информацию, на этот раз с кодом. рассмотрите следующее:

import sys 
from PyQt4.QtGui import * 
from PyQt4.QtCore import * 

class MyHighlighter(QSyntaxHighlighter): 

    def __init__(self, parent, theme): 

     QSyntaxHighlighter.__init__(self, parent) 
     self.parent = parent 
     keyword = QTextCharFormat() 


     self.highlightingRules = [] 

     # keyword 
     brush = QBrush(Qt.darkBlue, Qt.SolidPattern) 
     keyword.setForeground(brush) 
     keyword.setFontWeight(QFont.Bold) 
     keywords = QStringList([ "break", "else", "for", "if", "in", 
            "next", "repeat", "return", "switch", 
            "try", "while" ]) 
     for word in keywords: 

      pattern = QRegExp("\\b" + word + "\\b") 
      rule = HighlightingRule(pattern, keyword) 
      self.highlightingRules.append(rule) 


     # braces 
     singlebraces = QTextCharFormat() 
     pattern = QRegExp("\{(.*?)\}") 
     pattern.setMinimal(False) 
     brush = QBrush(Qt.darkRed, Qt.SolidPattern) 
     singlebraces.setForeground(brush) 
     rule = HighlightingRule(pattern, singlebraces) 
     self.highlightingRules.append(rule) 

    def highlightBlock(self, text): 

     for rule in self.highlightingRules: 

      expression = QRegExp(rule.pattern) 
      index = expression.indexIn(text) 
      while index >= 0: 
       length = expression.matchedLength() 
       self.setFormat(index, length, rule.format) 
       index = text.indexOf(expression, index + length) 
      self.setCurrentBlockState(0) 

class HighlightingRule(): 

    def __init__(self, pattern, format): 

     self.pattern = pattern 
     self.format = format 

class TestApp(QMainWindow): 

    def __init__(self): 

     QMainWindow.__init__(self) 
     font = QFont() 
     font.setFamily("Courier") 
     font.setFixedPitch(True) 
     font.setPointSize(10) 
     editor = QTextEdit() 
     editor.setFont(font) 
     highlighter = MyHighlighter(editor, "Classic") 
     self.setCentralWidget(editor) 
     self.setWindowTitle("Syntax Highlighter") 


if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    window = TestApp() 
    window.show() 
    sys.exit(app.exec_()) 

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

Примечание: Я попробовал выражение \{(.*?)\} на веб-сайте и да, это действительно сработало, но не понятно, почему выражение не работает в коде.

+0

Хо, это не работает для вас? то, что сжимается с '>>> re.findall (r '\ {(. +?) \}', s) ['quick', 'перепрыгнул через', 'собаку', '[0ld] man', ' 'to'] ' – Kasramvd

+0

Ваше регулярное выражение работает ... Вы можете проверить здесь https://regex101.com/r/kV5dR1/1 Если у вас все еще есть проблема, разместите свой код здесь. – Asunez

ответ

0

следующие SO вопросы, кажется, есть ответ, по крайней мере, тот, который работает для меня. Выражение

"\\{(.*)\\}" 

Кажется, это трюк. Но я хотел бы знать, ПОЧЕМУ. Мое знание регулярного выражения может быть написано полностью, с двойным интервалом на обратной стороне салфетки. Любое дополнительное разъяснение поможет

-1

Таким образом, следующее работает для меня:

string = 'The {quick} brown fox {jumped over the} lazy old {dog}. While {the [0ld] man} spoke {to the} gardener.' 

import re 

ans = re.findall(r'{.*?}', string) 

Как отметил @Alan Мур, я был неправ насчет re согласования неэкранированные скобки, по-прежнему не нужны отпущения последовательности, если вам вы raw string нотация r'string'.

+0

* Я использую python 2.10/pyqt и класс QRQExp pyqt для Windows. * Ваш ответ не решает проблему в исходном вопросе. –

+0

Я не знаю о 'pyqt', но этот ответ определенно неверен для модуля' re' Python. Это не может быть необходимо, чтобы избежать скобок в этом регулярном выражении, но это не так. Небезопасные круглые скобки являются метасимволами; они будут * не * соответствовать буквально. –

1

Вы должны использовать setMinimal(true):

QRegExp.setMinimal (сам, BOOL минимален)

Включает или отключает минимальное соответствие. Если минимальное значение false, соответствие является жадным (максимальным), которое является значением по умолчанию.

Таким образом, код будет выглядеть следующим образом:

QRegExp rx("\\{(.*)}"); 
rx.setMinimal(true); 
Смежные вопросы