Что нового

[RegExp] шаблон для цифр без разделителей разрядов

axlwor

Скриптер
Сообщения
657
Репутация
147
:'( что то на выходных сильно туплю
есть страница с цифрами. разряды цифр разделены точками.
Код:
>123.456<абракадабра>123.456.789.012<
ну и так далее..
можно ли получить цифры через StringRegExp
Код:
123456
123456789012
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
623
Код:
#include <array.au3>
$s = '>123.456<абракадабра>123.456.789.012<'
$s_new = StringReplace($s, '.', '')
$p = '>(\d+)<'
$a = StringRegExp($s_new, $p, 3)

_ArrayDisplay($a)
 
Автор
A

axlwor

Скриптер
Сообщения
657
Репутация
147
так я тоже выкрутился, но мечталось сразу stringregexp, без stringreplace :'(
нус.. оставлю тему нерешенной, вдруг случится чудо :-[
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
623
axlwor [?]
но мечталось сразу stringregexp, без stringreplace
зачем? это можно сделать, если ты дашь строку в строгом формате с указанием, что есть постоянная часть текста а что может меняться. к примеру, первые цифры 123.456 обязательно встретятся? или их может не быть? или таких фрагментов может быть несколько? но самое главное – длина числа может меняться?
но может оказаться, что те часы которые ты провел над придумыванием супер-пупер-крутого шаблона не стоит свеч. надо искать самый простой и рабочий способ. и искать другие, только если этот простой не устраивает по каким-то причинам.
 
Автор
A

axlwor

Скриптер
Сообщения
657
Репутация
147
рабочий вариант есть. он работает.. но ведь хочется всего и сразу
между >< цифры. Если число больше 3х разрядов, появляются точки для разделения тысяч, миллионов etc.
числа только целые, поэтому в тексте встречаются только [0-9.]
строка - код html. большая и нужный шаблон будет частью.
На текущий момент (упрощенно) получаю цифры с точками, потом убираю точки. Все работает, но наступил момент, когда хочется уменьшить время работы программы. Поэтому ищу различные способы убирания "лишнего" кода
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
623
axlwor [?]
хочется уменьшить время работы программы.
не факт, что изменив шаблон ты уменьшишь время работы. скорость обработки шаблоном зависит от "сложности" шаблона, т.к. он компилируется (причем каждый раз, когда вызывается) для передачи в PCRE. большие куски текста вообще не комильфо. к примеру сейчас, я не вижу очевидного и простого способа построить регвыр для твоего случая. а тот единственный способ, который мне видится годным, не применим, потому что AutoIt не поддерживает именованных групп, как в Python.
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
axlwor [?]
но наступил момент, когда хочется уменьшить время работы программы

Даже если удастся сделать в один присест, не факт, что время работы уменьшится.
Для разных вариантов текста скорость stringregexp бывает значительно больше stringreplace.


На текущий момент (упрощенно) получаю цифры с точками, потом убираю точки.

Возможно это немного ускорит работу, т.к тегов должно быть меньше чем точек

Код:
$sStr=StringRegExpReplace ( $sText ,'[^\d<]','' )

А далее один раз StringSplit тегов " < " для получения масссива
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
623
gregaz
StringRegExpReplace – это сокращенная запись двух команд StringRegExp и StringReplace, и, я почти уверен, по времени будет как сумма времени выполнения каждой из них
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
Код:
;Тест разных вариантов решения задачи
$s = '<asdfasdf>123.456<asdf>123.456.789.012<asdf>' ;html
For $i = 0 To 16 Step +1
	If $i > 20 Then ExitLoop ;!
	$s &= $s
Next

Dim $OneTestResult[4], $EndResult[4] = [0,0,0,0] ;результат одного теста, среднний результат

$Tests = 10 ;колличество тестов
For $i = 1 To $Tests Step +1
	ConsoleWrite('Test ' & $i & '/' & $Tests & @LF) ;тест
	test($OneTestResult) ;ByRef
	$EndResult[0] += $OneTestResult[0]
	$EndResult[1] += $OneTestResult[1]
	$EndResult[2] += $OneTestResult[2]
	$EndResult[3] += $OneTestResult[3]
Next

$EndResult[0] /= $Tests ;Средний результат
$EndResult[1] /= $Tests
$EndResult[2] /= $Tests
$EndResult[3] /= $Tests

ConsoleWrite('---------------------------------------------' & @LF) ;Output
ConsoleWrite('1: ' & $EndResult[0] & @LF)
ConsoleWrite('2: ' & $EndResult[1] & @LF)
ConsoleWrite('3: ' & $EndResult[2] & @LF)
ConsoleWrite('4: ' & $EndResult[3] & @LF)
ConsoleWrite('---------------------------------------------' & @LF)

Func test(ByRef $OneTestResult)
	$i1 = TimerInit()
	$a1 = StringRegExp(StringReplace($s, '.', ''), '>(\d+)<', 3) ;Вариант 1
	$OneTestResult[0] = TimerDiff($i1)

	$i2 = TimerInit()
	$a2 = StringSplit(StringRegExpReplace($s, '[^\d<]', ''), '<') ;Вариант 2
	$OneTestResult[1] = TimerDiff($i2)

	$i3 = TimerInit()
	$a3 = StringRegExp(StringReplace(StringRegExpReplace($s, '(<.*?>)(?=\d|$)', '-'), '.', ''), '\d+', 3) ;Вариант 3
	$OneTestResult[2] = TimerDiff($i3)

	$i4 = TimerInit()
	$a4 = StringRegExp(StringRegExpReplace(StringRegExpReplace($s, '(<.*?>)(?=\d|$)', '-'), '\.', ''), '\d+', 3) ;Вариант 4
	$OneTestResult[3] = TimerDiff($i4)
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
dwerf,
Судя по Вашему тесту (у меня), первый вариант, который предложил Kaster, и есть самый оптимальный по скорости, причем с приличным отрывом. :smile:
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
madmasles [?]
Судя по Вашему тесту (у меня), первый вариант, который предложил Kaster, и есть самый оптимальный по скорости.

У меня, как это не странно, четвёртый.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
dwerf [?]
У меня, как это не странно, четвёртый.
У меня:
Код:
Windows XP SP3 x86:
1: 2705.81098994425
2: 9659.75725965172
3: 3435.17930351483
4: 4548.87336239662

Windows 7 SP1 x86:
1: 1292.95655831164
2: 2535.30849700851
3: 1190.41936014535
4: 1140.13986234997
:shok: :wacko:
 
Верх