如何使用regexp获取nestedgroups

2024-05-23 15:42:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要你的帮助跟踪正则表达式。 我有短信

"[Hello|Hi]. We are [inviting | calling] you at position [[junior| mid junior]|senior] developer."

我想用正则表达式

^{pr2}$

下面的rexeg (\[[^\[$\]\]]*\])

给了我 [Hello|Hi] [inviting | calling] [junior| mid junior]

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


Tags: youdeveloperhellopositionhi短信areat
3条回答

让我们定义您的字符串并导入:

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

现在,试试:

^{pr2}$

更详细

考虑一下这个脚本:

$ 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]

您可以将以下代码与PyPi regex module一起与一个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]']
>>> 

参见regex demo。在

\[(?:[^][]++|(?R))*]匹配[,然后是除][以外的零个或多个1+字符序列,或者是整个方括号表达式[...],然后是一个结束的]。在

您可以使用一个简单的stack来代替recursive 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]', '[inviting | calling]', '[[junior| mid junior]|senior]', '[sd[sd[sd][sd]]]']

相关问题 更多 >