Python 如何使用regexp获取嵌套组

Python 如何使用regexp获取嵌套组,python,regex,nested-groups,Python,Regex,Nested Groups,我需要你的帮助来学习下面的正则表达式。 我有一条短信 "[Hello|Hi]. We are [inviting | calling] you at position [[junior| mid junior]|senior] developer." 使用我想要的正则表达式 [Hello|Hi] [inviting | calling] [[junior| mid junior]|senior] 以下rexeg(\[^\[$\]\]]*\]) 给我 [你好|你好] [邀请|呼叫] [jun

我需要你的帮助来学习下面的正则表达式。 我有一条短信

"[Hello|Hi]. We are [inviting | calling] you at position [[junior| mid junior]|senior] developer."
使用我想要的正则表达式

[Hello|Hi]
[inviting | calling]
[[junior| mid junior]|senior]
以下rexeg
(\[^\[$\]\]]*\])

给我

[你好|你好]
[邀请|呼叫]
[junior | mid junior]


那么我应该如何修复它以获得正确的输出呢

让我们定义字符串并重新导入:

>>> s = "[Hello|Hi]. We are [inviting | calling] you at position [[junior| mid junior]|senior] developer."
>>> import re
现在,试试:

>>> re.findall(r'\[ (?:[^][]* \[ [^][]* \])* [^][]*  \]', s, re.X)
['[Hello|Hi]', '[inviting | calling]', '[[junior| mid junior]|senior]']
更详细地 考虑以下脚本:

$ cat script.py
import re
s = "[Hello|Hi]. We are [inviting | calling] you at position [[junior| mid junior]|senior] developer."

matches = re.findall(r'''\[       # Opening bracket
        (?:[^][]* \[ [^][]* \])*  # Zero or more non-bracket characters followed by a [, followed by zero or more non-bracket characters, followed by a ]
        [^][]*                    # Zero or more non-bracket characters
        \]                        # Closing bracket
        ''',
        s,
        re.X)
print('\n'.join(matches))
这将产生以下输出:

$ python script.py
[Hello|Hi]
[inviting | calling]
[[junior| mid junior]|senior]

您可以将以下代码与PCRE一起使用,如
r'\[(?:[^][+++;(?r))*]'
regex:

>>> import regex
>>> s = "[Hello|Hi]. We are [inviting | calling] you at position [[junior| mid junior]|senior] developer."
>>> r = regex.compile(r'\[(?:[^][]++|(?R))*]')
>>> print(r.findall(s))
['[Hello|Hi]', '[inviting | calling]', '[[junior| mid junior]|senior]']
>>> 


\[(?:[^][++++(?R))*]
匹配一个
[
,然后零个或多个1+字符序列,而不是
]和
[
或整个括号内表达式
[…]
,然后是一个结束的

您可以使用一个简单的
堆栈来代替
递归regex

x="[Hello|Hi]. We are [inviting | calling] you at position [[junior| mid junior]|senior] developer.[sd[sd[sd][sd]]]"
l=[]
st=[]
start=None
for i,j in enumerate(x):
    if j=='[':
        if j not in st:
            start = i
        st.append(j)
    elif j==']':
        st.pop()
        if not st:
            l.append(x[start:i+1])
print l

输出:
['[Hello | Hi]'、[inventing | calling]'、[[junior | mid junior]| senior]、[sd[sd[sd][sd]]]].

re模块不支持此类任务所需的正则表达式递归。您可能想看看大多数正则表达式的实现都无法完成解析嵌套表达式的任务:PCRE是正则表达式的扩展,这就是为什么PCRE“regex”下面的解决方案与您习惯的正则表达式语法完全不同。您接受的解决方案仅适用于3个级别。它不是通用解决方案。p要求使用嵌套括号,一旦您添加第三个级别,这将不再有效。三个级别的扩展是显而易见的。如果他需要任意的深巢,那将是一个问题。OP可能想澄清一下。