Python正则表达式:精确匹配括号

6

我正在尝试解析以下格式的字符串:

text = "some random string <inAngle> <anotherInAngle> [-option text] [-anotherOption ] [-option (Y|N)]"

我希望将该字符串分成三个部分:

  1. 仅限于“some random string”
  2. 所有仅限于尖括号内的内容,例如上面的inAngle和anotherInAngle。
  3. 所有方括号内的内容。

如果我使用正则表达式:

re.findall(r'\[(.+?)\]', text)

它在方括号内提供了我需要的一切。但是,如果我使用相同的正则表达式和尖括号,

re.findall(r'<(.+?)>', text)

它提取方括号内的尖括号中的文本。例如,上面的[-anotherOption]中的“text”我不需要。尖括号匹配的正则表达式应该只返回上面的“inAngle”和“anotherInAngle”。

另外,我如何只获取第一部分,即“some random string”。该字符串可以有2或3个单词。


你预期的输出会是什么? - Avinash Raj
3个回答

2
尝试一下这个正则表达式是否可以捕获你所需的内容。
\s*([^><[\]]+\b)|\[([^]]*)]|<([^>]*)>
  • \s* 前面有可选的空格
  • ([^><[\]]+\b) 第一组:任何非括号字符直到\b(如果不需要则删除)
  • |\[([^]]*)] 或者第二组:方括号内的内容
  • |<([^>]*)> 或者第三组:尖括号内的内容

在regex101上查看演示(如果需要,可以使用“代码生成器”)


1
您可以在搜索尖括号中的内容之前,简单地忽略方括号中的所有内容:
interm = re.sub(r'\[(.*?)\]', '', text)
re.findall(r'<(.+?)>', interm)

输出

['inAngle', 'anotherInAngle']

为了匹配第一部分,匹配到[<之前的所有内容。如果允许在第一部分中随机嵌入任何一个未关闭的符号,则此方法无法正常工作:

re.findall(r'([^<\[]+)', text)[0]

输出

some random string 

谢谢大家。所有的解决方案都很好,但我会选择Macmee的,因为它在放入我的代码时更容易阅读 :) 。我遇到的另一个问题是,在某些情况下,尖括号匹配前面有一个单词。例如:some random string -aWord <string>。我想一起获取-aWord部分和"string"。如何做到这一点? - user775093

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接