我有下面提到的表格的数据:
<a> <b> <c> <This is a string>
<World Bank> <provides> <loans for> <"a Country's Welfare">
<Facebook> <is a> <social networking site> <"Happy Facebooking => Enjoy">
现在我想根据分隔符&lt;&gt;拆分上面给出的每一行。那就是我想分裂为:
['<a>', '<b>', '<c>', '<This is a string>']
['<World Bank>', '<provides>', '<loans for>', '<"a Country\'s Welfare">']
['<Facebook>', '<is a>', '<social networking site>', '<"Happy Facebooking => Enjoy">']
我尝试基于空格和“&gt;”进行拆分,但它不起作用。在python中是否有其他方式可以用上面描述的方式分割。由于我的文件大小为1 TB,因此我无法手动执行此操作。
答案 0 :(得分:7)
您希望在 >
和<
字符之间的空白上进行拆分。为此,您需要使用look-behind和look-ahead断言进行正则表达式拆分:
import re
re.split('(?<=>)\s+(?=<)', line)
这会在任何前面有\s+
并后跟>
字符的空格(<
)上拆分。
(?<=...)
表达式是一个后视断言;它匹配输入文本中的位置,即断言内的模式位于该位置之前的任何位置。在上面,它匹配当前位置之前有>
字符的任何地方。
(?=...)
表达式就像后面的断言一样,但在当前位置之后查找匹配的字符。它被称为前瞻性断言。 (?=<)
表示它将匹配<
字符后跟的任何位置。
它们共同形成两个锚点,其间的\s+
只匹配位于>
和<
之间的空格,但不是这两个字符本身。拆分通过删除匹配的文本来分解输入字符串,并且只匹配空格,并且文本的>
和<
字符将被拆分。
演示:
>>> re.split('(?<=>)\s+(?=<)', '<a> <b> <c> <This is a string>')
['<a>', '<b>', '<c>', '<This is a string>']
>>> re.split('(?<=>)\s+(?=<)', '''<World Bank> <provides> <loans for> <"a Country's Welfare">''')
['<World Bank>', '<provides>', '<loans for>', '<"a Country\'s Welfare">']
>>> re.split('(?<=>)\s+(?=<)', '<Facebook> <is a> <social networking site> <"Happy Facebooking => Enjoy">')
['<Facebook>', '<is a>', '<social networking site>', '<"Happy Facebooking => Enjoy">']
答案 1 :(得分:0)
这是一种“构建自己的解析器”方法,它只是逐个字符地浏览文件,并且不使用任何花哨的正则表达式功能:
def tag_yielder(line):
in_tag = False
escape = False
current_tag = ''
for char in line:
if in_tag:
current_tag += char
if char == '>' and not escape:
yield current_tag
current_tag = ''
in_tag = False
if char == '=':
escape = True
else:
escape = False
else:
if char == '<':
current_tag = '<'
in_tag = True
for line in open('tag_text.txt'):
print([tag for tag in tag_yielder(line.strip())])
输出:
['<a>', '<b>', '<c>', '<This is a string>']
['<World Bank>', '<provides>', '<loans for>', '<"a Country\'s Welfare">']
['<Facebook>', '<is a>', '<social networking site>', '<"Happy Facebooking => Enjoy">']