私は仕事で正規表現を書くことにしばしば遭遇し、それらをデバッグすることには常に不快感を覚えます。 世界にはさまざまな種類のデバッガがありますが、問題はレギュラーの問題です。たとえば、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コードに変更する必要があるためです。
プロジェクトはここで完全に利用可能です 。