使用交替运算符匹配多个正则表达式模式?

Jul*_*val 10 python regex regex-alternation

我使用Python Regex遇到了一个小问题.

假设这是输入:

(zyx)bc
Run Code Online (Sandbox Code Playgroud)

我想要实现的是获得括号中的任何内容作为单个匹配,以及任何外部的char作为单独的匹配.期望的结果将是:

['zyx','b','c']
Run Code Online (Sandbox Code Playgroud)

应保持比赛顺序.

我试过用Python 3.3获得这个,但似乎无法弄清楚正确的正则表达式.到目前为止,我有:

matches = findall(r'\((.*?)\)|\w', '(zyx)bc')
Run Code Online (Sandbox Code Playgroud)

print(matches) 产生以下结果:

['zyx','','']
Run Code Online (Sandbox Code Playgroud)

我有什么想法我做错了吗?

Jam*_*dge 12

来自以下文件re.findall:

如果模式中存在一个或多个组,则返回组列表; 如果模式有多个组,这将是一个元组列表.

当你的正则表达式匹配字符串三次时,该(.*?)组在前两次匹配时为空.如果你想要正则表达式的另一半的输出,你可以添加第二组:

>>> re.findall(r'\((.*?)\)|(\w)', '(zyx)bc')
[('zyx', ''), ('', 'b'), ('', 'c')]
Run Code Online (Sandbox Code Playgroud)

或者,您可以删除所有组以再次获取简单的字符串列表:

>>> re.findall(r'\(.*?\)|\w', '(zyx)bc')
['(zyx)', 'b', 'c']
Run Code Online (Sandbox Code Playgroud)

您需要手动删除括号.


ala*_*lan 5

其他答案已经向您展示了如何获得所需的结果,但需要手动删除括号的额外步骤。如果您在正则表达式中使用环视,则无需手动去除括号:

>>> import re
>>> s = '(zyx)bc'
>>> print (re.findall(r'(?<=\()\w+(?=\))|\w', s))
['zyx', 'b', 'c']
Run Code Online (Sandbox Code Playgroud)

解释:

(?<=\() // lookbehind for left parenthesis
\w+     // all characters until:
(?=\))  // lookahead for right parenthesis
|       // OR
\w      // any character
Run Code Online (Sandbox Code Playgroud)