2012-03-18 4 views
1

私はCaliberライブラリを管理しようとしています。 CalibreはPython regexを使ってデータベースフィールドを操作します。特に、sub()メソッドに対する "pattern"引数と "repl"引数を指定することができます。しかしそれはあなたができることのすべてであり、他のコーディングはありません。私の現在の問題は、私のグループ表現に一致するものがない場合、Caliberは「不一致グループ」エラーを報告し、処理を拒否することです。文字列または空の文字列と一致する一致グループをreモジュールsub()で作成しますか?

「常に一致しますが、本当に存在しない場合は空の文字列を含むグループを作成できますか?

サブストリングが見つかった場合は、サブストリングでフィールドを置き換えるか、サブストリングが見つからない場合は空のストリングに置き換えます。私は最初の例から「パーン10」を選ぶと、「Tswの7」第四の例から、シリーズフィールドにそれらを書きたい

Anne McCaffrey - Pern 10 - The Renegades of Pern 
Generation Warriors 
The Mystery of Ireta: Dinosaur Planet & Dinosaur Planet Survivors 
Anne McCaffrey - Tsw 7 - Ship That Returned 

:私は現在のようなタイトルを混ぜています。これどうやってするの?

私の現在、誤った表現が

(((P<author>[^-]*?)-)?((?P<series>\w+)\W*(?P<series_index>\d*)\s-))?(?P<title>.*) 

現時点で私が欲しいだけのフィールドは、任意のアイデアを

\g<series> 

感謝です!です

+0

本当にPerlの 're'モジュールを使用しているとは思いませんか?私はそれがPerl正規表現を使用すると思う。あなたはPythonの 're'モジュールを考えていますか? PerlがサポートしているPythonという名前のキャプチャ構文を使用しているのを見ていますが、私のコメントによれば、私はJavaの構文がよかったです。 – tchrist

+0

[Calibre](http://calibre-ebook.com/)はPythonアプリケーションです。私は説明とタグを修正しました。 – daxim

答えて

1

私が正しく要件を理解していた場合、あなたが書くことができるはずのように、それが聞こえる:

^(?:(?! -).)*(?: -)?(?P<series>(?:(?! -).)*) 

初期^(?:(?! -).)*部分は最初のスペースハイフン - スペース—前に、すべてを飲み込むか、単にすべてを飲み込むしますスペースハイフンスペースがない場合は、

(?: -)?の部分は、最初のスペースハイフンスペースがある場合はそれを飲み込みます。

(?P<series>...)の中の(?:(?! -).)*部分は、2番目のスペースハイフンスペース(または2番目のスペースハイフンスペースが見つからない場合は、ストリングの終わり)まで、飲み込まれていないものすべてを飲み込みます。すべてが既に飲み込まれている場合、これは単に空の文字列になります。言い換えれば

は、上記とほぼ同等です:

@parts = split $title,/- /, 3; 
$series = ((@parts > 1) ? $parts[1] : ''); 

あなたのためにその仕事はウィル?

+0

'split'アプローチははるかに複雑なパターンを使用するものよりずっと優れています。 – tchrist

+0

私はこれを知っていると確信していますが、 '(? ...)'といっしょに書かれた '(?P ...) 'の構文が見つかりました。名前付きキャプチャグループには、他の言語の正規表現ライブラリとの互換性構文バリエーションがたくさんありますが、私は '(? ...)と' \ k 'のスタイルペアを統一しました。パターン再帰のための '(?&name)'の構文を呼び出す "正規表現サブルーチン"を加えました。 Java 7のパターンライブラリは、 '(? ...) 'と' \ k 'スタイルですが、再帰は許可されません。 – tchrist

+0

素晴らしい!私はそれが十分にうまくいくようにするために後続の "。*"を追加するだけでした。ありがとう! – Charlweed