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)
您需要手动删除括号.
其他答案已经向您展示了如何获得所需的结果,但需要手动删除括号的额外步骤。如果您在正则表达式中使用环视,则无需手动去除括号:
>>> 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)
| 归档时间: |
|
| 查看次数: |
45894 次 |
| 最近记录: |