Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用正则表达式捕获括号中的文本(如果存在)_Python_Regex - Fatal编程技术网

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

Python 使用正则表达式捕获括号中的文本(如果存在),python,regex,Python,Regex,现在我正在编写一个python脚本来解析kindles在有人突出显示、记录笔记或书签时生成的“我的剪报”文件。我使用regex从文件中收集数据,然后计划将其存储在sqlite数据库中。但现在,我很难匹配包含书名的行,可能还有作者 这条线有三种可能。它们可以采用以下格式: Title (Last, First) Title (Author) Title 我想要的是正则表达式捕获标题,如果结尾括号中存在任何内容,则捕获空白字符串。例如,我希望这里的正则表达式给出结果: ('Title', 'Las

现在我正在编写一个python脚本来解析kindles在有人突出显示、记录笔记或书签时生成的“我的剪报”文件。我使用regex从文件中收集数据,然后计划将其存储在sqlite数据库中。但现在,我很难匹配包含书名的行,可能还有作者

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

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

('Title', 'Last, First')
('Title', 'Author')
('Title', '')
现在我设法做了一个正则表达式来捕捉括号,但是没有作者的标题。以下是我现在拥有的:

(.+) (?:\((.+)\)(?:\n|\Z))*
唯一的问题是它要求行以作者结尾,如果我给它一个接受空白字符串的选项,它会发现整行都是没有作者的标题。i、 e

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

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

^(.+?)(?: \((.+)\))?$
我添加了线锚的开始和线锚的结束,然后将空间放在第一个非捕获组中,这样就可以捕获没有任何其他细节的标题。我将
*
运算符更改为
,因为我认为您不会有超过一对括号。如果你认为你有更多,就改变

我删除了第二个非捕获组,因为线端锚点将确保它是线端


演示。

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

(\w+?)(?:\s?\(([\w,\s]*)\))?$
这涵盖了其他一些情况,如缩进、括号前缺少空格和空括号

下面是一个演示:

文件如下:

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

将产生您想要的结果。

我认为您不需要开始\w+?在这种情况下不贪婪。它只是增加了不必要的回溯。除此之外,我喜欢这个答案的灵活性。嗯,你答案中的正则表达式与演示中的不同。(\w+?)(?:\s?([\w\s]*))?$啊是的,哎呀-我刚才把“+”改成了“*”,以说明括号是空的。修好了。