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 selfself。SIGNAL_preparedself。onPrepared

QtCore。 QObject connect selfself。SIGNAL_excRaiseself。onRaiseException



def callSearchRegExp self

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

自己uistatusBarclearMessage

試してください

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 = threadingTimer 1self。CallSearchRegExp

self ._timer。 開始



def onPrepared self 、value

自己uieHtml setHtml



def onRaiseException self 、value

自己uistatusBarshowMessage



def showGroups self 、rows

自己uilvasクリア

行のeの場合:

isinstance e、 tuple )の場合

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

自己uilvasaddItem '、'join 準備済み

その他

自己uilvasaddItem 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 ] + selfphtml 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