Python 捕获两个可选组

Python 捕获两个可选组,python,regex,Python,Regex,我想捕获序列'AE'(如果有)前面的单词或序列'BE'(如果有)前面的单词,或者如果两个序列都出现在一个字符串中,则捕获两个单词 我尝试使用以下正则表达式: TEST = re.compile( r'(.*?)' r'(?:(\w+) AE)?' r'.*?' r'(?:(\w+) BE)?') 它捕获'BE'前面的一个单词或'AE'前面的一个单词,但不捕获 两个字 >>> TEST.match('').groups() ('', None,

我想捕获序列
'AE'
(如果有)前面的单词或序列
'BE'
(如果有)前面的单词,或者如果两个序列都出现在一个字符串中,则捕获两个单词

我尝试使用以下正则表达式:

TEST = re.compile(
    r'(.*?)'
    r'(?:(\w+) AE)?'
    r'.*?'
    r'(?:(\w+) BE)?')
它捕获
'BE'
前面的一个单词或
'AE'
前面的一个单词,但不捕获 两个字

>>> TEST.match('').groups()
('', None, None)
>>> TEST.match('foo AE').groups()
('', 'foo', None)
>>> TEST.match('foo BE').groups()
('', None, 'foo')
>>> TEST.match('foo AE bar BE').groups()
('', 'foo', None)
相反,我希望输出的最后一行是

>>> TEST.match('foo AE bar BE').groups()
('', 'foo', 'bar')
使用:


re.findall
在这里很有用。编译模式通常是不必要的。在文档中,“传递给
re.match()
re.search()
re.compile()
的最新模式的编译版本被缓存,因此一次只使用几个正则表达式的程序不必担心编译正则表达式。”@StevenRumbalski,感谢您的评论。我只是不想在答案中重复同一个模式多次,而是想保持OP的代码风格。这并不理想,因为当只有一组匹配时,我不知道它是哪一组(AE还是BE?。@ErnestA,试试
pattern=re.compile(r'\s*(*?)\s*(AE | BE);pattern.findall('foo-AE-bar-BE')
=>
[('foo','AE'),('bar','BE')]
>>> pattern = re.compile(r'\s*(.*?)\s*(?:AE|BE)')
>>>
>>> pattern.findall('')
[]
>>> pattern.findall('bar BE')
['bar']
>>> pattern.findall('foo AE')
['foo']
>>> pattern.findall('foo AE bar BE')
['foo', 'bar']