我有一个字符串,大约有270 M行,如下所示;
<DOC> <DOC>+BDTag
<S> <S>+BSTag
--- ----
--- ----
</S> </S>+ESTag
<S> <S>+BSTag
--- ----
--- ----
</S> </S>+ESTag
<S> <S>+BSTag
--- ----
--- ----
</S> </S>+ESTag
-----
我想在所有字符串中获取<S> <S>+BSTag
和</S> </S>+ESTag
之间的字符,并创建一个列表。
你能给我一个最快解决方案的例子吗?
谢谢,
答案 0 :(得分:4)
一个简单的解决方案可以使用正则表达式。
例如,使用re.findall
我们可以写,
>>> str = """<DOC> <DOC>+BDTag
... <S> <S>+BSTag
... hello world
... </S> </S>+ESTag
... <S> <S>+BSTag
... line 2
... </S> </S>+ESTag
... <S> <S>+BSTag
... line 3
... </S> </S>+ESTag
... -----"""
>>> re.findall(r'<S> <S>\+BSTag(.*?)</S> </S>\+ESTag', str, re.DOTALL)
['\nhello world\n', '\nline 2\n', '\nline 3\n']
它的作用是什么?
<S> <S>\+BSTag
匹配起始行。(.*?)
,.*
匹配任何内容。 ?
使其变得懒惰,以便在看到第一个结束行时停止。</S> </S>\+ESTag
匹配结束行re.DOTALL
这确保.
也匹配新行。