使用正则表达式排除括号内的术语

时间:2012-03-02 00:31:40

标签: python regex

我只想捕获大写不在括号中的单词:

Reggie (Reginald) Potter -> Reggie Potter

我正在使用这个正则表达式:

test = re.findall('([A-Z][a-z]+(?:\s\(.*?\))?(?=\s[A-Z])(?:\s[A-Z][a-z]+)+)', 'Reggie (Reginald) Potter')

我得到了回复:

Reggie (Reginald) Potter

我想是因为这不是捕捉:

(?:\s\(.*?\))

我不会回到括号内的任何内容

2 个答案:

答案 0 :(得分:2)

如果要避免的单词与括号直接相邻,则可以使用negative look-behinds and look-aheads来匹配括号内的单词:

(?<!\()\b([A-Z][a-z]+)\b(?!\))

答案 1 :(得分:0)

我会使用更简单的正则表达式和列表理解:

all_words = re.findall(r'(\(?\b[A-Z][a-z]+\b\)?)', 'Reggie (Reginald) Potter')
good_matches = [word for word in all_words if len(word) > 0 and not (word[0] == '(' and word[-1] == ')')]

现在good_matches正如预期的那样['Reggie', 'Potter']