在python中提取花括号之间的文本

时间:2018-02-21 22:00:59

标签: python regex

我有一串文字,如下面的

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

我想提取 上面字符串中的abcmemo。 我有正则表达式如下[link [dlc.init]/17.6.3 基本上{(?:[^{}])*} 但它捕获了所有内容(returns abc, cde, memo, bleh)

3 个答案:

答案 0 :(得分:3)

我会保持简单。

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)),但我发现将其分解为逻辑步骤会很有帮助。

答案 1 :(得分:1)

你可以这样做:

\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']

答案 2 :(得分:1)

简单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']