PyRogeレギュラーデバッガー

こんにちは、%username%。Pythonで正規表現を入力する際に​​絶え間ない問​​題に悩まされている場合は、こちらにいます。

私は仕事で正規表現を書くことにしばしば遭遇し、それらをデバッグすることには常に不快感を覚えます。 世界にはさまざまな種類のデバッガがありますが、問題はレギュラーの問題です。たとえば、Rubyから正規表現を取得するなど、方言が異なるため、Pythonで実行することはできません。 そのため、Pythonで小さなプログラムを作成しました。これにより、プロファイルの問題をすばやく解決できました。 インターネット上のどこかにプログラムのロジックに気付きました(Rubyのデバッガーがありました)。 はい、コードにコメントすることも決めました。それはあまりありませんが、ソースへの最もイライラするリンクについてはこちらです。

最初の例として、お気に入りのtimurvパズルのソリューションが読み込まれます-Look -And-Sayシーケンスを続けます 。 次のようになります。





Python2.5、PyQt4.4、Windows XPマシン、Ubuntu 9.10でテスト済み。



__name__ == "__main__"の場合 :

app = QtGui。 QApplication ( sys。Argv )

ui = Ui_mwd ( )

フォーム= Wnd ( ui )

ui。 setupUi (フォーム)

フォーム。 表示 ( )

フォーム。 callSearchRegExp ( ) #初めての評価用

sys exit ( app。exec_ ( ) )


ui_Wndは、 QtGui.QMainWindowクラスのインスタンスを変更するクラスです-pyuicによって自動的に生成されます。 WndはQMainWindowの子孫であり、それについては以下です。 PyQtは少し不快です-見ると、ウィンドウにぶら下がっているすべてのコントロールはui_Wndクラスに属しますが、同じQtDesignerでイベントを定義すると、QMainwindowの子孫に落ちるので、コードには混乱があり、 Wnd(ui)を渡す必要があります-Wndクラスでコントロールを参照できること。



クラス Wnd ( QtGui。QMainWindow ) :

_timer = なし

SIGNAL_prepared = QtCore。 SIGNAL ( '準備済み(QString)' )

SIGNAL_excRaise = QtCore。 SIGNAL ( 'exceptionRaise(QString)' )

_observer = ObserveHtmlWidget ( )



def __init__ ( self 、ui ) :

QtGui。 QMainWindow __init__ ( self )

自己 。 ui = ui

QtCore。 QObject connect ( self 、 self。SIGNAL_prepared 、 self。onPrepared )

QtCore。 QObject connect ( self 、 self。SIGNAL_excRaise 、 self。onRaiseException )



def callSearchRegExp ( self ) :

txt、rg = unicode ( ( self。ui。eText。toPlainText ( ) ) ) 、 unicode ( self。ui。eReg。toPlainText ( ) )

自己 。 ui 。 statusBar 。 clearMessage ( )

試してください :

data = self ._observer ( txt、rg )

SmartError を除く 、e:

自己 。 emit ( self .SIGNAL_excRaise 、e [ 0 ] ) ;

帰る



if ( data ) :

自己 。 emit ( self。SIGNAL_prepared 、data [ 0 ] )

自己 。 showGroups (データ[ 1 ] )



def callTimerForRegExp ( self ) :

if ( self ._timer ) :

self ._timer。 キャンセル ( )

self ._timer = threading 。 Timer ( 1 、 self。CallSearchRegExp )

self ._timer。 開始 ( )



def onPrepared ( self 、value ) :

自己 。 ui 。 eHtml setHtml (値)



def onRaiseException ( self 、value ) :

自己 。 ui 。 statusBar 。 showMessage (値)



def showGroups ( self 、rows ) :

自己 。 ui 。 lvas 。 クリア ( )

行のeの場合:

isinstance ( e、 tuple )の場合 :

Prepared = [ eのi に対する inverseReplace ( i ) ]

自己 。 ui 。 lvas 。 addItem ( '、' 。 join (準備済み) )

その他 :

自己 。 ui 。 lvas 。 addItem ( inverseReplace ( e ) )


これはメインウィンドウクラスです。原則として、ここではすべてが透過的です。

_timerは、入力完了を監視できるデバイスです

メインプログラムストリームに正規表現が計算されたか、バックグラウンドで計算されなかったことを通知する信号のペア

オブザーバー -計数機



callTimerForRegExp-最後の文字を入力してから1秒経過してからcallSearchRegExpを呼び出します。プログラム内の有効なエラーに関するregexpデータまたは宣言された例外を返すコンピューターを既に呼び出しています。 showGroups-このことにより、定期的に見つけられるグループを正しく描画できます。



#高度な正規表現の評価

クラス ObserveHtmlWidget ( オブジェクト ) :

phtml = '< span style = "background-color:#BFE4FF; color:#0066B3; padding:2px;">%s< / span>'

def _exec ( self 、func、value、ignoreExc ) :

試してください :

値= func (値)

ignoreExc を除き 、e:

SmartErrorを発生させます( '%s:%s' % ( type ( e ) .__ name__、e [ 0 ] ) )

戻り値



def __call__ ( self 、text = `` 、regexp = '' ) :

正規表現== ''の 場合 :

帰る

html、グループ= '' 、 [ ]



text、regexp = htmlReplace ( text ) 、protectedReplace ( regexp )

ptn = self ._exec ( re。compile、regexp、re。error )

matches = self ._exec ( ptn。search、text、 Exception )

while (マッチおよびテキスト<> '' ) :

s、e、v =一致。 start ( ) 、一致します。 end ( ) 、一致します。 グループ ( )

グループ。 追加 (一致します。 グループ ( ) )

html + = text [ :s ] + self 。 phtml % v

e 0でない場合 :

テキスト=テキスト[ 1 : ]

else : #null値の反復

テキスト=テキスト[ e: ]

一致= ptn。 検索 (テキスト)

return ( html +テキスト、グループ)




これは電卓そのものであり、テキストとその通常のテキストを受け取り、偶然に実行されます。すべてが順調であれば、強調表示された一致のテキストとグループのリストを返します。 エラーが発生した場合、 SmartErrorエラーの正しいインスタンスが返されます。



#簡単な置換

クラス HtmlReplacer ( オブジェクト ) :

mods = { '>' : '&gt;' 、 '<' : '&lt;' }

def __call__ ( self 、raw ) :

自分自身の k、v に対して 。 mods iteritems ( ) :

raw = raw。 置換 ( k、v )

生で返す



#正規表現で置換する

クラス ProtectedHtmlReplacer ( HtmlReplacer ) :

mods = { ' \> ' : '&gt;' 、 ' \ < ' : '&lt;' }



#逆置換

クラス InverseHtmlReplacer ( HtmlReplacer ) :

mods = { '&gt;' : '>' 、 '&lt;' : '<' }



#呼び出しを簡単にするために、オブジェクトのインスタンスを作成します

htmlReplace、protectedReplace、inverseReplace = HtmlReplacer ( ) 、ProtectedHtmlReplacer ( ) 、InverseHtmlReplacer ( )



#このプロジェクトの有効な例外

クラス SmartError ( Exception ) : パス




さて、これはhtmlタグを置き換える無料のコードアプリケーションです。テキストを強調表示するコントロールウィンドウでは、htmlモードを使用し、<>文字を正しく表示するには、対応するhtmlコードに変更する必要があるためです。



プロジェクトはここで完全に利用可能です 。



All Articles