Парсинг текста с таблицей в словарь
Мне нужно распарсить текст в ключ:значение, и чтобы это было универсально, если текст будет меняться, правильно и лучше сделать через регулярку, но я не особо в ней разбираюсь, и прошу помощи тут. Вот пример возможного текста (получается путем 'show variables like '%password%';' в sql). Я и сам почти смог сделать, но не могу пустые значения никак учесть
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| validate_password.check_user_name | ON |
| validate_password.dictionary_file | |
| validate_password.length | 8 |
| validate_password.mixed_case_count | 1 |
| validate_password.number_count | 1 |
| validate_password.policy | MEDIUM |
| validate_password.special_char_count | 1 |
+--------------------------------------+--------+
+-------------------------------+-----------------------+
| Variable_name | Value |
+-------------------------------+-----------------------+
| server_audit_events | CONNECT,QUERY,TABLE |
| server_audit_excl_users | |
| server_audit_file_path | server_audit.log |
| server_audit_file_rotate_now | OFF |
| server_audit_file_rotate_size | 1000000 |
| server_audit_file_rotations | 9 |
| server_audit_incl_users | |
| server_audit_logging | ON |
| server_audit_mode | 0 |
| server_audit_output_type | file |
| server_audit_query_log_limit | 1024 |
| server_audit_syslog_facility | LOG_USER |
| server_audit_syslog_ident | mysql-server_auditing |
| server_audit_syslog_info | |
| server_audit_syslog_priority | LOG_INFO |
+-------------------------------+-----------------------+
Пытался сделать вот так, и по списку сделать словарь, но теряется пустое значение, и вот сижу думаю, никак не придумаю
Ответы (2 шт):
Автор решения: strawdog
→ Ссылка
не понятно, зачем вам регулярка, если можно просто сплитить:
d = dict()
for i in info.split("\n"):
if not "+--" in i and len(i):
res = i.split("|")
d[res[1].strip()] = res[2].strip()
правда, заголовок попадает в словарь тоже, но с этим, думаю, вы разберетесь. d:
{'Variable_name': 'Value', 'validate_password.check_user_name': 'ON', 'validate_password.dictionary_file': '', 'validate_password.length': '8', 'validate_password.mixed_case_count': '1', 'validate_password.number_count': '1', 'validate_password.policy': 'MEDIUM', 'validate_password.special_char_count': '1'}
Автор решения: SergFSM
→ Ссылка
потестируйте такую регулярку:
from re import findall
dict(findall(r'\| (.+?)\s*\| (.+?)\s*\|',text))
>>> out
{'Variable_name': 'Value',
'server_audit_events': 'CONNECT,QUERY,TABLE',
'server_audit_excl_users': ' ',
'server_audit_file_path': 'server_audit.log',
'server_audit_file_rotate_now': 'OFF',
'server_audit_file_rotate_size': '1000000',
'server_audit_file_rotations': '9',
'server_audit_incl_users': ' ',
'server_audit_logging': 'ON',
'server_audit_mode': '0',
'server_audit_output_type': 'file',
'server_audit_query_log_limit': '1024',
'server_audit_syslog_facility': 'LOG_USER',
'server_audit_syslog_ident': 'mysql-server_auditing',
'server_audit_syslog_info': ' ',
'server_audit_syslog_priority': 'LOG_INFO'}
