我只想捕获大写不在括号中的单词:
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\(.*?\))
我不会回到括号内的任何内容
答案 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']
。