使用正则表达式捕获括号中的文本(如果存在)

时间:2013-06-21 10:44:53

标签: python regex

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

这条线有三种可能性。它们的格式可以是:

Title (Last, First)
Title (Author)
Title

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:1)

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

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

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

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

演示here

答案 1 :(得分:1)

这是我的版本,与Jerry非常相似,但也许更安全一点:

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

这包括一些案例,例如缩进,在括号前缺少空格以及空括号。

以下是演示:http://www.rubular.com/r/8C1pireOwV

答案 2 :(得分: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')
>>> 

将产生您想要的结果。