3 回答
TA贡献1864条经验 获得超6个赞
变通模式可以是匹配以 开头的行{{info
,然后匹配任何 0+ 个尽可能少的字符直到仅}}
在其上的行:
re.findall(r'(?sm)^{{[^\S\r\n]*info\s*(.*?)^}}$', s)
请参阅正则表达式演示。
细节
(?sm)
-re.DOTALL
(现在,.
匹配换行符)和re.MULTILINE
(^
现在,匹配行的开头并$
匹配行的结束位置)标志^
- 一行的开始{{
- 一个{{
子串[^\S\r\n]*
- 0+ 个水平空格info
- 一个子串\s*
-0+空格(.*?)
-第1组:0个以上的字符,尽可能少^}}$
- 一行的开头和行的}}
结尾。
TA贡献1872条经验 获得超3个赞
这个答案解释了如何使用递归来做到这一点(尽管是圆括号,但是很容易适应),但是,就我个人而言,我只是使用while循环来编写它:
b = 1
i = si = s.index('{')
i += 1
while b:
if s[i] == '{': b += 1
elif s[i] == '}': b -=1
i += 1
ss = s[si:i]
其中,您的字符串定义为:s,给出子字符串,ss,为:
>>> print(ss)
{{info .................
.....texts..............
...{{ some text }}...... // nested parenthesis 1
........................
...{{ some text }}...... // nested parenthesis 2
........................
}}
添加回答
举报