Python 2.7:为什么正则表达式A | B在列表中给我额外的元素

时间:2016-06-22 15:51:42

标签: regex python-2.7

假设我有一个包含以下信息的输入文件:

/* Name: David */
/* Age: 30
....
....
/* Name: Ben */
/* Age: 35
....
....

我想提取每个人的姓名,并找出是否有关于年龄的信息。我的想法是使用正则表达式来捕获名称(David,Ben等)并查看第二行是否有“Age”。

所以我的正则表达式看起来像这样:

regex = ".+Name ?: (.+) .+\n.+ (Age) ?:.+|.+Name ?: (.+) "

基本上我使用re.findall(regex,f.read())来查找所有名称和“Age”,我得到这样的东西:

[('David','Age',''),('Ben','Age','')]

如果Ben没有关于年龄的信息:

/* Name: David */
/* Age: 30
....
....
/* Name: Ben */
....
....
....

我的输出将是:

[('David','Age',''),('','','Ben')]

我的问题是我想如何得到:

[[('David','Age'),('Ben','')]

请注意,我不知道文件中每个人的姓名。另外,我使用的是Python 2.7。

1 个答案:

答案 0 :(得分:2)

它为每个元组提供三个元素的原因是你有三个捕获组,并且它将没有年龄的名称放入第三个元素的原因是它们匹配第三个捕获组。如果您想表示年龄是可选的,您应该将其包装在非捕获组((?:))中并使用?,这将为您提供最终的正则表达式:

.+Name ?: (.+)(?:.+\n.+ (Age) ?:.+)?

它与你的相同,但我没有替换和三个捕获组,而是有一个可选的部分,只有两个,它可以给你想要的结果。