2

現在、誰かが強調表示したり、メモを取ったり、ブックマークしたりしたときに、kindles によって生成された My Clippings ファイルを解析するための Python スクリプトに取り組んでいます。ファイルからデータを収集するために正規表現を使用しています。次に、それを sqlite データベースに保存する予定です。ただし、現在、本のタイトルとおそらく著者を含む行を一致させるのに問題があります。

この行には 3 つの可能性があります。次の形式にすることができます。

Title (Last, First)
Title (Author)
Title

私が望むのは、正規表現がタイトルをキャプチャし、存在する場合は末尾の括弧内にあるものをキャプチャし、そうでない場合は空白の文字列をキャプチャすることです。たとえば、ここの正規表現で結果が得られるようにします。

('Title', 'Last, First')
('Title', 'Author')
('Title', '')

現在、括弧をキャプチャする正規表現を実行できましたが、著者のないタイトルはできませんでした。これが私が今持っているものです:

(.+) (?:\((.+)\)(?:\n|\Z))*

唯一の問題は、行が著者で終わる必要があることです。空白文字列を受け入れるオプションを指定すると、行全体が著者のないタイトルであることがわかります。すなわち

('Title (Last, First)', '')
('Title (Author)', '')
('Title', '')
4

3 に答える 3

1

次のようなファイルを使用します。

Title (Last, First)
Title (Author)
Title 
Title ()
    Title ()
The Title (Bob, Jones)

以下:

import re
matches = []
with open('file.txt') as f:
    for line in f:
        matches.append(re.match(r'^\s*([\w\s]+) \(?(.*?)\)?$',line).groups())

for m in matches:
    print m
('Title', 'Last, First')
('Title', 'Author')
('Title', '')
('Title', '')
('Title', '')
('The Title', 'Bob, Jones')
>>> 

あなたの望む結果を生み出します。

于 2013-06-21T11:28:28.213 に答える
1

これは私のバージョンで、ジェリーのものと非常に似ていますが、おそらく少し安全です:

(\w+?)(?:\s?\(([\w,\s]*)\))?$

これは、インデント、括弧の前のスペースの欠落、空の括弧などのいくつかのケースをカバーしています。

ここにデモがあります: http://www.rubular.com/r/8C1pireOwV

于 2013-06-21T11:07:54.793 に答える