Regex: Повторные группы фиксации

Я должен проанализировать некоторые таблицы от текстового ASCII-файла. Вот частичный образец:

QSMDRYCELL   11.00   11.10   11.00   11.00    -.90      11     11000     1.212
RECKITTBEN  192.50  209.00  192.50  201.80    5.21      34      2850     5.707
RUPALIINS   150.00  159.00  150.00  156.25    6.29       4        80      .125
SALAMCRST   164.00  164.75  163.00  163.25    -.45      80      8250    13.505
SINGERBD    779.75  779.75  770.00  773.00    -.89       8        95      .735
SONARBAINS   68.00   69.00   67.50   68.00     .74      11      3050     2.077

Таблица состоит из 1 столбца текста и 8 столбцов чисел с плавающей точкой. Я хотел бы получить каждый столбец через regex.

Я довольно плохо знаком с регулярными выражениями. Вот дефектный regex шаблон, который я придумал:

(\S+)\s+(\s+[\d\.\-]+){8}

Но шаблон получает только первое и последние столбцы. RegexBuddy также испускает соблюдающее предупреждение:

Вы повторили саму группу фиксации. Группа получит только последнее повторение. Поместите группу фиксации вокруг повторной группы для получения всех повторений.

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

Как я могу получить каждый столбец отдельно?

12
задан johnnyRose 6 September 2016 в 15:50
поделиться

2 ответа

В C# (модифицировано из этого примера):

string input = "QSMDRYCELL   11.00   11.10   11.00   11.00    -.90      11     11000     1.212";
string pattern = @"^(\S+)\s+(\s+[\d.-]+){8}$";
Match match = Regex.Match(input, pattern, RegexOptions.MultiLine);
if (match.Success) {
   Console.WriteLine("Matched text: {0}", match.Value);
   for (int ctr = 1; ctr < match.Groups.Count; ctr++) {
      Console.WriteLine("   Group {0}:  {1}", ctr, match.Groups[ctr].Value);
      int captureCtr = 0;
      foreach (Capture capture in match.Groups[ctr].Captures) {
         Console.WriteLine("      Capture {0}: {1}", 
                           captureCtr, capture.Value);
         captureCtr++; 
      }
   }
}

Output:

Matched text: QSMDRYCELL   11.00   11.10   11.00   11.00    -.90      11     11000     1.212
...
    Group 2:      1.212
         Capture 0:  11.00
         Capture 1:    11.10
         Capture 2:    11.00
...etc.
14
ответ дан 2 December 2019 в 07:02
поделиться

К сожалению, вам нужно повторить (…) 8 раз, чтобы получить каждый столбец отдельно.

^(\S+)\s+([-.\d]+)\s+([-.\d]+)\s+([-.\d]+)\s+([-.\d]+)\s+([-.\d]+)\s+([-.\d]+)\s+([-.\d]+)\s+([-.\d]+)$

Если код возможен, вы можете сначала сопоставить эти числовые столбцы целиком

>>> rx1 = re.compile(r'^(\S+)\s+((?:[-.\d]+\s+){7}[-.\d]+)$', re.M)
>>> allres = rx1.findall(theAsciiText)

, а затем разделить столбцы пробелами

>>> [[p] + q.split() for p, q in allres]
4
ответ дан 2 December 2019 в 07:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: