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コードに変更する必要があるためです。

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

Source: https://habr.com/ru/post/J85361/


All Articles