【问题标题】:Python RegEx for exact matches of bracketsPython RegEx 用于括号的精确匹配
【发布时间】:2016-02-18 06:13:25
【问题描述】:

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

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

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

  1. 只是“一些随机字符串”
  2. 仅在尖括号中的所有内容。即上面的 inAngle 和 anotherInAngle。
  3. 方括号中的所有内容。

如果我使用正则表达式

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

它在方括号内提供了我需要的一切。但是,如果我使用带尖括号的相同 RegEx,

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

它给出了在方括号内的尖括号内的文本。例如,上面的“文本”在 [-anotherOption] 内。我不要那个。尖括号匹配的正则表达式应该只从上面返回“inAngle”“anotherInAngle”。 它的正则表达式是什么?

我如何只获得第一部分,即“一些随机字符串”。这个字符串可以有 2 或 3 个单词

【问题讨论】:

  • 您的预期输出是什么?

标签: python regex string


【解决方案1】:
<(.+?)>(?![^\[]*\])|\[(.+?)\]|((?!\s+)[^\[\]<>]+)

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

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

【讨论】:

    【解决方案2】:

    试试这个正则表达式是否可以capture 你需要的东西

    \s*([^><[\]]+\b)|\[([^]]*)]|<([^>]*)>
    
    • \s* 前面是可选的 whitespace
    • ([^&gt;&lt;[\]]+\b) 第 1 组:任何 non 括号直到 \b(如果不需要,请删除)
    • |\[([^]]*)] 或第 2 组:方括号内的内容
    • |&lt;([^&gt;]*)&gt; 或第 3 组:尖括号内的内容

    See demo at regex101(如果需要,使用“代码生成器”)

    【讨论】:

      【解决方案3】:

      在搜索尖括号中的内容之前,您可以简单地忽略方括号之间的所有内容:

      interm = re.sub(r'\[(.*?)\]', '', text)
      re.findall(r'<(.+?)>', interm)
      

      输出

      ['inAngle', 'anotherInAngle']
      

      然后为了匹配第一部分,匹配到[&lt; 的所有内容。如果允许字符串在第一部分中随机嵌入这些符号中的任何一个,这将不起作用:

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

      输出

      some random string 
      

      【讨论】:

      • 谢谢大家。所有解决方案都很好,但我会选择 Macmee 的,因为它在放入我拥有的代码时更容易阅读:)。我遇到的另一个问题是,在某些情况下,尖括号匹配前面有一个单词。例如:一些随机字符串 -aWord 。我想得到 -aWord 部分以及 "string" 。如何获得?
      猜你喜欢
      • 1970-01-01
      • 2011-12-15
      • 2019-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      相关资源
      最近更新 更多