正则表达式突出显示大括号之间的所有内容
QRegEx to highlight everything between braces
我正在尝试获取正则表达式来匹配花括号之间的文本
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,以及 Windows.
上 pyqt 的 QRegExp class
谁能指出我做错了什么。
只是为了添加更多细节,这次使用了一些代码。考虑以下
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_() )
好吧,当我 运行 这并在花括号之间键入任何内容时,它不会突出显示为红色。为了更好的衡量,我留下了关键字以表明代码确实进行了语法高亮显示。
注意:
我确实在网站上尝试了表达式 \{(.*?)\}
,是的,它确实有效,但不清楚为什么该表达式在代码中不起作用。
所以,以下对我有用:
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'
,您仍然不需要转义序列。
您需要使用setMinimal(true)
:
QRegExp.setMinimal (self, bool minimal)
Enables or disables minimal matching. If minimal is false, matching is greedy (maximal) which is the default.
因此,代码将如下所示:
QRegExp rx("\{(.*)}");
rx.setMinimal(true);
以下 SO 个问题似乎有答案,至少有一个对我有用。表达式
"\{(.*)\}"
似乎可以解决问题。但我想知道为什么。我的正则表达式知识可以完全用双倍行距写在餐巾纸的背面。任何额外的说明都会有所帮助
我正在尝试获取正则表达式来匹配花括号之间的文本
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,以及 Windows.
上 pyqt 的 QRegExp class谁能指出我做错了什么。
只是为了添加更多细节,这次使用了一些代码。考虑以下
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_() )
好吧,当我 运行 这并在花括号之间键入任何内容时,它不会突出显示为红色。为了更好的衡量,我留下了关键字以表明代码确实进行了语法高亮显示。
注意:
我确实在网站上尝试了表达式 \{(.*?)\}
,是的,它确实有效,但不清楚为什么该表达式在代码中不起作用。
所以,以下对我有用:
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'
,您仍然不需要转义序列。
您需要使用setMinimal(true)
:
QRegExp.setMinimal (self, bool minimal)
Enables or disables minimal matching. If minimal is false, matching is greedy (maximal) which is the default.
因此,代码将如下所示:
QRegExp rx("\{(.*)}");
rx.setMinimal(true);
以下 SO 个问题似乎有答案,至少有一个对我有用。表达式
"\{(.*)\}"
似乎可以解决问题。但我想知道为什么。我的正则表达式知识可以完全用双倍行距写在餐巾纸的背面。任何额外的说明都会有所帮助