首页 > 解决方案 > 正则表达式:在第二个制表符出现之前返回一行中的所有内容

问题描述

我有一个语料库文件,其中包含以下格式的数据:

Hi.   bonjour.  CC-BY 2.0 (France) Attribution: tatoeba.org #538123 (CM) & #629296 (Samer)
black!  noir!   CC-BY 2.0 (France) Attribution: tatoeba.org #906328 (papabear) & #1245450 (saeb)

基本上用 \teg 分成三个字段:

\t bonjour \t CC-BY 2.0(法国)署名:tatoeba.org #538123 (CM) & #629296 (Samer)

我试图只获取键:值:

Hi.   bonjour.
black!  noir!

并避免接下来发生的一切。这就是我在 key:value 之后添加额外元数据之前的做法:

def load_doc(filename):
    with codecs.open(filename, "r+", "utf-8") as file:
        file = file.read()
        return file


def to_pairs(doc):
    lines = doc.strip().split('\n')
    pairs = [line.split('\t') for line in  lines]
    return pairs

pairs = to_pairs(load_doc(filename))

谢谢你的帮助!

标签: regexpython-3.xfileparsing

解决方案


这是完成这项工作的一种方法:

import re

lines = [
    'Hi.\tbonjour.\tCC-BY 2.0 (France) Attribution: tatoeba.org #538123 (CM) & #629296 (Samer)',
    'black!\tnoir!\tCC-BY 2.0 (France) Attribution: tatoeba.org #906328 (papabear) & #1245450 (saeb)',
]

for line in lines:
    pairs = re.search(r'^(.+?)\t(.+?)(?=\t)', line)
    print(pairs.groups())

    #added parentheses to built-in method 'print' OP Python v3+

输出:

('Hi.', 'bonjour.')
('black!', 'noir!')

推荐阅读