【问题标题】:QRegEx to highlight everything between braces正则表达式突出显示大括号之间的所有内容
【发布时间】:2015-09-17 12:49:01
【问题描述】:

我正在尝试获取一个正则表达式来匹配大括号之间的文本

The following SO question。给了我一个开始,但它对我不起作用。而且我不确定我做错了什么。 考虑以下几点:

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

我要做的是匹配花括号之间的所有文本,以便突出显示它们。表达式

\{(.*?)\}

对我不起作用。我不确定为什么。 我在 Windows 上使用 python 2.10/pyqt 和 pyqt 的 QRegExp 类。

谁能指出我做错了什么。

只是为了添加更多细节,这次是一些代码。考虑以下

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_() )

好吧,当我运行它并在花括号之间键入任何内容时,它不会突出显示为红色。只是为了更好地衡量,我保留了关键字以表明代码确实进行了语法突出显示。

注意: 我确实在网站上尝试了 \{(.*?)\} 表达式,是的,它确实有效,但不清楚为什么该表达式在代码中不起作用。

【问题讨论】:

  • 它不适合你吗? >>> re.findall(r'\{(.+?)\}',s) ['quick', 'jumped over the', 'dog', 'the [0ld] man', 'to the'] 怎么了
  • 您的正则表达式有效...您可以在这里查看regex101.com/r/kV5dR1/1 如果您仍然有问题,请在此处发布您的代码。

标签: python regex python-2.7 pyqt4


【解决方案1】:

你需要使用setMinimal(true):

QRegExp.setMinimal (self, bool minimum)

启用或禁用最小匹配。如果 minimum 为 false,则匹配为贪婪(最大),这是默认值。

因此,代码将如下所示:

QRegExp rx("\\{(.*)}"); 
rx.setMinimal(true);

【讨论】:

    【解决方案2】:

    以下SO 问题似乎有答案,至少有一个对我有用。表达式

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

    似乎可以解决问题。但我想知道为什么。我的正则表达式知识可以完全写在餐巾纸背面,双倍行距。任何额外的说明都会有所帮助

    【讨论】:

      【解决方案3】:

      所以,以下对我有用:

      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 Moore 所指出的,我对匹配未转义括号的re 是错误的,如果您使用原始字符串表示法r'string',您仍然不需要转义序列。

      【讨论】:

      • 我在 Windows 上使用的是 python 2.10/pyqt,以及 pyqt 的 QRegExp 类。您的回答并没有解决原问题中的问题。
      • 我不知道pyqt,但这个答案对于Python 的re 模块来说绝对是错误的。在这个正则表达式中转义大括号可能不是必要,但这样做并没有错。未转义的括号是元字符;他们将按字面意思匹配。
      猜你喜欢
      • 2018-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-20
      • 1970-01-01
      • 2019-04-15
      • 2011-09-06
      相关资源
      最近更新 更多