Как распечатать определенную часть строки YAML - PullRequest
0 голосов
/ 24 сентября 2019

Моя база данных YAML:

left:
  - title: Active Indicative
    fill: "#cb202c"
    groups:
      - "Present | dūc[ō] | dūc[is] | dūc[it] | dūc[imus] | dūc[itis] | dūc[unt]"

Мой код Python:

import io
import yaml

with open("C:/Users/colin/Desktop/LBot/latin3_2.yaml", 'r', encoding="utf8") as f:
    doc = yaml.safe_load(f)
txt = doc["left"][1]["groups"][1]
print(txt)

В настоящее время мой вывод Present | dūc[ō] | dūc[is] | dūc[it] | dūc[imus] | dūc[itis] | dūc[unt], но я хотел бы, чтобы вывод был ō, is, it или imus.Возможно ли это в PyYaml и если да, то как бы я это реализовал?Заранее спасибо.

1 Ответ

1 голос
/ 25 сентября 2019

У меня нет решения PyYaml, но если у вас уже есть строка из файла YAML, вы можете использовать модуль Python regex для извлечения текста внутри [ ].

import re

txt = "Present | dūc[ō] | dūc[is] | dūc[it] | dūc[imus] | dūc[itis] | dūc[unt]"

parts = txt.split(" | ")
print(parts)  
# ['Present', 'dūc[ō]', 'dūc[is]', 'dūc[it]', 'dūc[imus]', 'dūc[itis]', 'dūc[unt]']

pattern = re.compile("\\[(.*?)\\]")
output = []
for part in parts:
    match = pattern.search(part)
    if match:
        # group(0) is the matched part, ex. [ō]
        # group(1) is the text inside the (.*?), ex. ō
        output.append(match.group(1))
    else:
        output.append(part)

print(" | ".join(output))
# Present | ō | is | it | imus | itis | unt

Код сначала разбивает текст на отдельные части, а затем перебирает каждую часть search -ing для шаблона [x].Если он находит его, он извлекает текст в скобках из объекта match и сохраняет его в списке.Если part не соответствует шаблону (например, 'Present'), он просто добавляет его как есть.

В конце все извлеченные строки имеют вид join -вместе перестроил строку без скобок.


РЕДАКТИРОВАТЬ на основе комментария :

Если вам нужен только один изстроки внутри [ ], вы можете использовать тот же шаблон регулярных выражений, но вместо этого использовать метод findall для всего txt, который вернет list соответствующих строк вв том же порядке, что они были найдены .

import re

txt = "Present | dūc[ō] | dūc[is] | dūc[it] | dūc[imus] | dūc[itis] | dūc[unt]"

pattern = re.compile("\\[(.*?)\\]")
matches = pattern.findall(txt)
print(matches) 
# ['ō', 'is', 'it', 'imus', 'itis', 'unt']

Тогда нужно просто использовать переменную для выбора элемента из списка:

selected_idx = 1  # 0-based indexing so this means the 2nd character
print(matches[selected_idx])
# is
...