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

6 投票
3 回答
5916 浏览
提问于 2025-05-10 09:55

我正在尝试解析一个特定格式的字符串,格式如下:

text = "一些随机字符串 <在尖括号内> <另一个在尖括号内> [-选项文本] [-另一个选项] [-选项 (Y|N)]"

我想把这个字符串分成三部分。

  1. 仅仅是 "一些随机字符串"
  2. 所有仅在尖括号内的内容,比如上面的在尖括号内和另一个在尖括号内。
  3. 所有在方括号内的内容。

如果我使用这个正则表达式:

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

它能提取出方括号内的所有内容。但是如果我用同样的正则表达式去处理尖括号,

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

它会把方括号内的尖括号内容也提取出来。例如,上面提到的 "text" 就是在 [-另一个选项] 里面的。我不想要这个。针对尖括号的正则表达式应该只返回 "在尖括号内" 和 "另一个在尖括号内"。

那么,针对这个情况,正则表达式应该怎么写呢?

另外,我该怎么只提取第一部分,也就是 "一些随机字符串"。这个字符串可以有2到3个单词。

相关文章:

  • 暂无相关问题
暂无标签

3 个回答

0
<(.+?)>(?![^\[]*\])|\[(.+?)\]|((?!\s+)[^\[\]<>]+)

你可以简单地使用这个 re.findall。看看这个演示。

https://regex101.com/r/hE4jH0/10

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 

撰写回答