Я должен проанализировать некоторые таблицы от текстового 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 также испускает соблюдающее предупреждение:
Вы повторили саму группу фиксации. Группа получит только последнее повторение. Поместите группу фиксации вокруг повторной группы для получения всех повторений.
Я консультировался с их справочным файлом, но у меня нет подсказки относительно того, как решить это.
Как я могу получить каждый столбец отдельно?
В 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.
К сожалению, вам нужно повторить (…)
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]