Регулярное выражение: вернуть все в строке до появления второй вкладки - PullRequest
0 голосов
/ 28 января 2020

У меня есть файл корпуса, который содержит данные в следующем формате:

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:

Hi \ t bonjour \ t CC -BY 2.0 (Франция) Атрибуция: tatoeba.org # 538123 (CM) & # 629296 (Samer)

Я пытаюсь чтобы получить только ключ: значение:

Hi.   bonjour.
black!  noir!

и избегать всего, что будет дальше. Так я делал до того, как дополнительные метаданные были добавлены после ключа: значение:

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))

Спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 28 января 2020

Вы можете использовать 2 отрицательных класса символов и 2 группы захвата.

^([^\t]+)\t([^\t]+)
  • ^ Начало строки (можно опустить, используя re.match )
  • ([^\t]+) Захват группа 1 Соответствует любому символу, кроме вкладки
  • \t Соответствие вкладке
  • ([^\t]+) Захват группа 2 Соответствует любому символу, кроме вкладки

Regex demo | Python demo

Если вы не хотите пересекать новую строку, вы можете добавить это к классу символов [^\t\r\n]

Например:

import re

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

lines = doc.strip().split('\n')
pairs = [re.match(r"([^\t]+)\t([^\t]+)", line).groups() for line in lines]
print (pairs)

Выход

[('Hi.', 'bonjour.'), ('black!', 'noir!')]
1 голос
/ 28 января 2020

Вот способ выполнить работу:

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!')
...