2

现在,我正在编写一个 python 脚本来解析当有人突出显示、记笔记或书签时由 kindles 生成的 My Clippings 文件。我正在使用正则表达式从文件中收集数据,然后我计划将其存储在 sqlite 数据库中。但现在,我无法匹配包含书名和可能作者的行。

这条线有三种可能性。它们可以采用以下格式:

Title (Last, First)
Title (Author)
Title

我想要的是正则表达式捕获标题,以及结尾括号中的任何内容(如果存在),否则捕获一个空白字符串。例如,我希望这里的正则表达式给我结果:

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

现在我设法做了一个正则表达式来捕获括号,但不是没有作者的标题。这是我现在拥有的:

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

唯一的问题是它要求该行以作者结尾,如果我给它一个接受空白字符串的选项,它会发现整行都是没有作者的标题。IE

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

3 回答 3

1

这是我的版本,它与 Jerry 的非常相似,但可能更安全一些:

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

这涵盖了更多的情况,例如缩进、括号前缺少空格和空括号。

这是一个演示:http ://www.rubular.com/r/8C1pireOwV

于 2013-06-21T11:07:54.793 回答
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

如果您尝试逐行匹配,则可以使用此正则表达式:

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

我添加了行首锚和行尾锚,然后将空格放在第一个非捕获组中,这样可以捕获没有任何其他细节的标题。我将*运算符更改为?,因为我认为您不会有超过一对括号。如果您认为您确实拥有更多,请进行更改。

我删除了第二个非捕获组,因为行尾锚将确保它是行尾。

演示在这里

于 2013-06-21T10:52:39.120 回答