Форум сайта python.su
ShamanФункция данной регулярки заключается в выборе полей, она не должна заниматься чисткой данных. Чисткой данных должен заниматься специальный участок, чья функция именно в этом и заключается. Так можно менять поиск независимо от чистоты данных и менять чистку независимо от целей поиска.
лучше учесть все случаи
Отредактировано py.user.next (Авг. 22, 2015 20:22:47)
Офлайн
ну пока поменять алгоритм создания я не могу - приходится юзать то что есть
Офлайн
py.user.nextВсё проще: эта регулярка вообще ничего не чистит - она просто берёт данные из того что дают.
Функция данной регулярки заключается в выборе полей, она не должна заниматься чисткой данных. Чисткой данных должен заниматься специальный участок, чья функция именно в этом и заключается.
Офлайн
ShamanКак не чистит, учитывает наличие \r, которого не должно быть. Из-за этого ты её и поменял с \n на \s+. То есть подчищает какой-то косяк, пришедший снаружи.
эта регулярка вообще ничего не чистит
Офлайн
py.user.nextНичего там не чистится. У нас уточнилась спецификация формата входящих данных и мы это учли в коде. Всё! А то, что там должно быть и чего там быть не должно - всего лишь твои домыслы.
Как не чистит, учитывает наличие \r, которого не должно быть.
py.user.nextНа сколько микропроцентов?
совпадение с одним симоволом будет работать быстрее на каждой записи.
Офлайн
Shaman
На сколько микропроцентов?
[guest@localhost ~]$ python3 -mtimeit -s "import re" "re.findall(r'\n', 'abc\n' * 10)"
100000 loops, best of 3: 3.65 usec per loop
[guest@localhost ~]$ python3 -mtimeit -s "import re" "re.findall(r'\s', 'abc\n' * 10)"
100000 loops, best of 3: 5.59 usec per loop
[guest@localhost ~]$ python3 -mtimeit -s "import re" "re.findall(r'\s+', 'abc\n' * 10)"
100000 loops, best of 3: 6.41 usec per loop
[guest@localhost ~]$
Офлайн
py.user.nextОтлично! А теперь то же самое для
Тут в два раза, но это самый простой случай. А там полей несколько, можно и замерить для там.
with open ("somefile.txt", "r") as myfile: data=myfile.read() data = re.sub('\r','',data) data = re.sub('\n\n','\n',data)
Отредактировано Shaman (Авг. 23, 2015 09:46:24)
Офлайн
ShamanС чего это вдруг? \d+ - необходимое условие, иначе как цифры накапливать?
Для полноты так же нужно посчитать затраты на “(\d+)” - вдруг от них тоже стоит отказаться?
ShamanДа надо просто файл через sed снаружи прогнать, если невозможно исправить алгоритм, который порождает его (со смешанными концами строк).
А теперь то же самое для
Офлайн
py.user.nextА это тонкий намёк на необходимость и других условий.
С чего это вдруг? \d+ - необходимое условие, иначе как цифры накапливать?
py.user.nextСпособ не важен, важно правильно сравнивать времена отработки.
Да надо просто файл через sed снаружи прогнать, если невозможно исправить алгоритм, который порождает его (со смешанными концами строк).
py.user.nextДопустим, у меня хватает благоразумия не фильтровать дважды.
Кстати, если есть этот костыль (re.sub()), то твоя регулярка не только будет дольше искать, но и работать впустую.
py.user.nextПочему ты считаешь содержимое побочным? Не знаешь почему до сих пор некоторые утилиты заикаются от отсутствия перевода строки в конце файлов, а другие в таких случаях намекают на некий “плохой стиль”?
Ты же привязал таким образом регулярку к побочному содержимому, которое ещё может быть удалено каким-нибудь способом.
Офлайн
«Если у вас была одна проблема, и вы решили использовать регулярные выражения, то теперь у вас есть две проблемы»
Конечные автоматы гораздо быстрее и надежнее
out =[] pos = -1 with open('d:\\info.txt') as f: for line in f: if line[0] == '-': pos = 0 elif pos == 0: mt = int(line.split(':')[1].strip().split(' ')[0]) pos = 1 elif pos == 1: mf = int(line.split(':')[1].strip().split(' ')[0]) pos = 2 elif pos == 2: buf = int(line.split(':')[1].strip().split(' ')[0]) pos = -1 out.append({'MemTotal':mt,'MemFree':mf,'Buffers':buf})
Офлайн