程序输出具有以下格式的行的文件
{Foo} Bar Bacon {Egg}
Foo
和Egg
可以,但不必,由几个词组成。 Bar
和Bacon
总是一个字。
我需要在变量中获取Bar
以获取更多代码。我想如果我将sting分成匹配的正则表达式,这将有效。这将返回四个元素的列表,因此我可以轻松地使用list[1]
获得第二个元素。
我怎么写这样的正则表达式?
我需要在单个空格' '
上拆分sting,但是只有当单个空格没有被花括号中的文本包围时。
\s(?=[a-zA-Z{}])
给了我所有的空间,因此表现得像' '
。如何排除花括号中的空格?
你可以尝试{[^}]*}\s(\w+)
>>> import re
>>> print re.search(r'{[^}]*}\s(\w+)', '{Foo} Bar Bacon {Egg}').group(1)
Bar
说明:
{[^}]*}
首先匹配花括号内的第一部分\s
然后是一个空白(\w+)
然后第二部分;你把它放在一个捕获组中,所以它在group(1)
的搜索结果中可用
re.search(pattern, string, flags=0)
扫描字符串,查找正则表达式模式产生匹配的第一个位置,并返回相应的匹配对象。如果字符串中没有位置与模式匹配,则返回None;请注意,这与在字符串中的某个点找到零长度匹配不同。
这可能有所帮助。
>>> import re
>>> line = '{Foo} Bar Bacon {Egg}'
>>> m = re.search(r'}\s+(\S+)\s+', line)
>>> m.group(1)
'Bar'
>>>
我刚刚搜索了一个紧随其后的任何单词。我使用()
对该单词进行分组,以便稍后使用m.group()
访问它
如果你真的想要所有四个元素,试试re.findall()
:
>>> line = '{Foo Goo} Bar Bacon {Egg Foo}'
>>> re.findall(r'{.*?}|\S+', line)
['{Foo Goo}', 'Bar', 'Bacon', '{Egg Foo}']