【问题标题】:Extracting text between curly braces in python在python中提取花括号之间的文本
【发布时间】:2018-02-21 22:00:59
【问题描述】:

我有一串文本,如下所示

1. Foobar { abc } ( Explanation - Foo { cde } - Count - 5301435 ) 2. Foobaz { memo } ( Explanation - baz {bleh } - Count - 13946664 )

我想提取 abcmemo 在上面的字符串中。 我的正则表达式如下[链接here] 本质上{(?:[^{}])*} 但它捕获了一切(returns abc, cde, memo, bleh)

【问题讨论】:

  • 那么你想要每行的第一个元素吗?
  • 所以你只想要每个字符串中的第一个实例?
  • @C8H10N4O2 是的..
  • 所以您希望文本嵌套在花括号中,而 不是 嵌套在括号中?你能完整地解释一下这个要求吗?
  • 这对于正则表达式来说相当棘手,而对于有状态解析器来说相当容易。我建议放弃正则表达式方法。

标签: python regex


【解决方案1】:

我会保持简单。

import re

s = '1. Foobar { abc } ( Explanation - Foo { cde } - Count - 5301435 ) 2. Foobaz { memo } ( Explanation - baz {bleh } - Count - 13946664 )'

s_without_parens = re.sub('\(.+?\)','',s)

text_in_brackets = re.findall('{(.+?)}',s_without_parens)

text_in_brackets

[' abc ', ' memo ']

因此您可以将其嵌套为 re.findall('{(.+?)}',re.sub('\(.+?\)','',s)),但我发现将其分解为合乎逻辑的步骤会很有帮助。

【讨论】:

    【解决方案2】:

    你可以这样做:

    \d+\.[^{]*{\s+([^}]+)\s+}
    

    并获取捕获的组。

    • \d+\. 匹配一个或多个数字,后跟 .

    • [^{]* 匹配到下一个{{\s+ 匹配{,后跟一个或多个空格

    • 捕获的组,([^}]+) 匹配到下一个}

    • \s+} 匹配一个或多个空格,后跟}

    示例:

    In [48]: blob = '1. Foobar { abc } ( Explanation - Foo { cde } - Count - 5301435 ) 2. Foobaz { memo } ( Explanation - baz {bleh } - Count - 13946664 )'
    
    In [49]: re.findall(r'\d+\.[^{]*{\s+([^}]+)\s+}', blob)
    Out[49]: ['abc', 'memo']
    

    【讨论】:

      【解决方案3】:

      简单的re.findall() 方法:

      import re
      
      s = '1. Foobar { abc } ( Explanation - Foo { cde } - Count - 5301435 ) 2. Foobaz { memo } ( Explanation - baz {bleh } - Count - 13946664 )'
      result = re.findall(r'\{ ([^{}]+) \} (?=\()', s)
      
      print(result)
      

      输出:

      ['abc', 'memo']
      

      【讨论】:

        猜你喜欢
        • 2010-09-27
        • 2019-02-26
        • 2019-02-07
        • 1970-01-01
        • 2014-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多