Регулярное выражение для сопоставления табличных данных

#regex

Вопрос:

Из таблицы ниже

  ----------------------------------------------------- 
|          Student Info                               |
| ---------------- -------------- -------------       |
|| Name           | Highschooled | County      |      |
| ---------------- -------------- -------------       |
|| Rob            | Y            | LA          |      |
| ---------------- -------------- -------------       |
|                                                     |
 ----------------------------------------------------- 
 

Я хочу проанализировать значения из столбцов.
Я попробовал регулярное выражение ниже в Golang, но что-то не так

Это регулярное выражение соответствует только первому столбцу

 `||([[:word:][:space:]] |) ?`
 

И этот жадный сопоставляет первые два столбца как один

 `^|((|[[:word:][:space:]] ) ?)|  |`
 

Вот мое рабочее место: https://regex101.com/r/sXQdq1/1

Комментарии:

1. Правильно, вы повторяете группу захвата, поэтому в ячейке памяти группы сохраняется только последнее записанное значение.

2. Как мне зафиксировать все значения?

3. Их никак не поймать. После сопоставления всей строки извлеките их или разделите.

4. Хорошо, Спасибо. Есть ли лучший способ сделать это?

5. Да, повторите цикл по строкам, проверьте, начинается ли он с || , затем разделите строку с | после удаления | пробелов и.

Ответ №1:

Вы не указали язык, поэтому я продемонстрирую его на Python.

Вы можете найти элементы таблицы, которые начинаются с || | полей для данных и анализируются между ними. Это можно сжать вместе для записи данных.

Дано:

 tbl='''
 ----------------------------------------------------- 
|          Student Info                               |
| ---------------- -------------- -------------       |
|| Name           | Highschooled | County      |      |
| ---------------- -------------- -------------       |
|| Rob            | Y            | LA          |      |
| ---------------- -------------- -------------       |
|                                                     |
 ----------------------------------------------------- '''
 

Вы можете сделать:

 import re 
pat=r'^||([^|] )|([^|] )|([^|] )|'

>>> dict(zip(*re.findall(pat, tbl, flags=re.M)))
{' Name           ': ' Rob            ', ' Highschooled ': ' Y            ', ' County      ': ' LA          '}
 

Если вам не нужно окружающее пустое пространство:

 >>> {k.strip():v.strip() for k,v in zip(*re.findall(pat, tbl, flags=re.M))}
{'Name': 'Rob', 'Highschooled': 'Y', 'County': 'LA'}
 

Если вам нужно более конкретное регулярное выражение, вы можете сделать ЭТО, которое будет соответствовать только таблице Student Info вверху.