我有一串文字,如下面的
1. Foobar { abc } ( Explanation - Foo { cde } - Count - 5301435 ) 2. Foobaz { memo } ( Explanation - baz {bleh } - Count - 13946664 )
我想提取
上面字符串中的abc
和memo
。
我有正则表达式如下[link [dlc.init]/17.6.3
基本上{(?:[^{}])*}
但它捕获了所有内容(returns abc, cde, memo, bleh)
答案 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']