Я пытаюсь разделить несколько строк сегмента из документа TTL, вот соответствующий код.

entry_obj = str(Entry(*re.findall(r'([;\s]+[^\s+|\s+$])', ''.join(buf))))
            yield process_entry_obj(entry_obj)

Код возвращает ошибку, и поскольку он не может разбить строку, число совпадающих аргументов каждый раз различается, и код не выполняется.

Ниже мой формат файла:

 File input

 ##  http://www.example.com/abc#AAA
                pms:ecCreatedBy rms:type ;
                rmfs:lag "Ersteller"@newyork ,
                "AAA"@wdc .

В файле несколько записей, как указано выше.

0
RJ_Singh 12 Апр 2019 в 07:48

2 ответа

Лучший ответ

Вы можете использовать

import re

s = "" # File contents
with open(filepath, 'r') as fr:
    s =fr.read()
s = re.sub(r'(?m)(rmfs:label\s*)("[^"]*"@(?!en)\w*)(\s*,\s*)("[^"]*"@en) \.$', r'\1\4\3\2 .', s)
s = re.sub(r'(?m)^(\s*###\s*http.*/v\d+#)\w*((?:\n(?!\n).*)*rmfs:label\s*")([^"]*)("@en)', r'\1\3\2\3\4', s)
# Wrtie to file:
with open(filepath, 'w') as fw:
    fw.write(s)

См. демонстрационную версию Python.

Вот Regex 1 и Демонстрации Regex 2.

Регулярное выражение 1

  • (?m) - многострочный режим, $ будет соответствовать концу строки
  • (rmfs:label\s*) - группа 1 (\1): rmfs:label, а затем 0+ пробелов
  • ("[^"]*"@(?!en)\w*) - Группа 2 (\2): ", 0+ не - " символов, "@, предварительная проверка, гарантирующая немедленное отсутствие en справа от текущей позиции, а затем 0+ слов символов
  • (\s*,\s*) - Группа 3 (\3): ,, заключенный в 0+ пробелов
  • ("[^"]*"@en) - Группа 4 (\4): ", 0+ символов, кроме ", " и @en
  • .$ - пробел, ., конец строки.

Подробности Regex 2

  • (?m) - многострочный узел, ^ начало строки соответствия
  • ^ - начало строки
  • (\s*###\s*http.*/v\d+#) - Группа 1: пробелы 0+, ###, пробелы 0+, http, любые символы 0+, /v, цифры 1+ и #
  • \w* - 0+ слов
  • ((?:\n(?!\n).*)*rmfs:label\s*") - Группа 2: любое количество строк до двойного разрыва строки ((?:\n(?!\n).*)*), а затем rmfs:label, 0+ пробелов и "
  • ([^"]*) - Группа 3: любые символы 0+, кроме "
  • ("@en) - Группа 4: "@en строка.
1
Wiktor Stribiżew 12 Апр 2019 в 10:53

Из того, что я понимаю, тебе нужно \s*;\s*

Пояснение:

\s* - соответствует символу пробела ноль или более раз

; - соответствует ; буквально

Демо

1
Michał Turczyn 12 Апр 2019 в 04:58