2013-06-21 48 views
2

現在我正在研究python腳本來解析由kindles生成的My Clippings文件,當有人突出顯示,記錄筆記或書籤時。我正在使用正則表達式從文件中收集數據,然後我打算將它存儲在sqlite數據庫中。但現在,我無法匹配包含書名和可能作者的行。使用正則表達式在parentesis中捕獲文本(如果它們存在)

這條線有三種可能性。他們可以採用以下格式:

Title (Last, First) 
Title (Author) 
Title 

我要的是對正則表達式捕捉標題,並且無論是在結束括號,如果它存在,否則捕獲一個空字符串。因此,例如,我想在這裏正則表達式來給我的結果:

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

現在我能夠做到的捕獲括號正則表達式,但不是冠軍而不作者。以下是我現在有:

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

唯一的問題是,它要求符合作者結束,如果我給它一個選項,以接受空字符串,它發現整條生產線是沒有作者的標題。即

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

回答

1

如果你嘗試匹配一行行,你可以使用這個表達式:

^(.+?)(?: \((.+)\))?$ 

我添加的行錨繩錨月底開始,然後把空間的第一非捕獲組,從而可以捕獲沒有任何其他細節的標題。我將*運營商更改爲?,因爲我認爲您不會有一對以上的括號。如果您認爲自己確實有更多,則更改。

我刪除了第二個非捕獲組,因爲行尾錨點將確保它是行的末尾。

演示here

1

這裏是我的版本,這是非常相似,傑裏的,但也許要安全一點:

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

這涵蓋了幾個案件,如壓痕,缺少括號前添加一個空格,而空方括號。

這裏有一個演示:http://www.rubular.com/r/8C1pireOwV

+0

我不認爲你需要開始\ w +?在這種情況下不貪婪。它只是增加了不必要的回溯。除此之外,我喜歡這個答案的靈活性。 –

+0

嗯,答案中的正則表達式與演示中的正則表達式不同。 (\ w +?)(?:\ s?\(([\ w,\ s] *)\))?$ –

+0

啊,是的,oops - 我只是把「+」改成了「*」說明空括號。 修正了它。 –

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') 
>>> 

會產生你想要的結果。

相關問題