Разделить несколько строк по регулярному выражению - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь разделить несколько строк сегмента из документа 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 .

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

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

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

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 .

Regex 1 подробности

  • (?m) - многострочный режим, $ будет соответствовать концу строки
  • (rmfs:label\s*) - группа 1 (\1): rmfs:label и затем 0+ пробелов
  • ("[^"]*"@(?!en)\w*) - Группа 2 (\2): ", 0+ не " символов, "@, проверка на будущее, гарантирующая отсутствие en непосредственно справа от текущей позиции, и тогда 0+ слово chars
  • (\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 siubstring.
1 голос
/ 12 апреля 2019

Насколько я понимаю, вам нужно \s*;\s*

Объяснение:

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

; - совпадение ; буквально

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...