在python中分裂线

时间:2013-05-22 23:22:21

标签: python python-2.7

我有下面提到的表格的数据:

<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,因此我无法手动执行此操作。

2 个答案:

答案 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">']