为了账号安全,请及时绑定邮箱和手机立即绑定

正则表达式在嵌套括号之间查找文本

正则表达式在嵌套括号之间查找文本

烙印99 2021-05-30 12:15:44
我有一个很长的字符串,它有嵌套循环。我想从中提取一个模式。String_Text:some random texts......................................................{{info ......................texts.................{{ some text }}...... // nested parenthesis 1...........................{{ some text }}...... // nested parenthesis 2........................}} // End of topmost parenthesis..........................again some random text................................................ // can also contain {{  }}......End of string.我想提取最上括号之间的所有文本,即Extracted_string:info ......................texts.................{{ some text }}...... // nested parenthesis 1...........................{{ some text }}...... // nested parenthesis 2........................图案:1.)以{开头,后跟任意数量的{。2.) 之后可以有任意数量的空格。3.) 后面的第一个词肯定是info。4.)取出直到未关闭此支架。到目前为止已经尝试了什么:re.findall(r'\{+[^\S\r\n]*info\s*(.*(?:\r?\n.*)*)\}+')我知道这是错误的,因为这样做是在字符串中找到}的最后一个实例。有人可以帮我提取这些括号之间的文字吗?TIA
查看完整描述

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个以上的字符,尽可能少

  • ^}}$- 一行的开头和行的}}结尾。


查看完整回答
反对 回复 2021-06-01
?
守着一只汪

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

........................

}}


查看完整回答
反对 回复 2021-06-01
  • 3 回答
  • 0 关注
  • 197 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信