Уведомления

Группа в Telegram: @pythonsu

#1 Июль 19, 2012 09:43:46

abogdan
Зарегистрирован: 2012-06-25
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Сравнение строк по маске

Есть строка вида:
MLIST 0x1 0x2 0x3 0x4 0,00 HELLO HI 0xa 854,166666666667 (a4) 1005,20833333333 (c1)
Необходимо сравнить по маске:
MLIST 0x1 0x2 0x3 0x4 * HELLO HI 0xa * (*) * (*)
Кто знает как реализовать?
Гугл молчит..

Офлайн

#2 Июль 19, 2012 10:28:13

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Сравнение строк по маске

Компилируете регулярку по маске и применяете её к строке. Если нашлось что-то, значит она подходит маске. По-моему, довольно логично.



Офлайн

#3 Июль 19, 2012 11:47:23

abogdan
Зарегистрирован: 2012-06-25
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Сравнение строк по маске

fata1ex
Компилируете регулярку по маске и применяете её к строке. Если нашлось что-то, значит она подходит маске. По-моему, довольно логично.
Да, несомненно! НО, в строке
MLIST 0x1 0x2 0x3 0x4 0,00 HELLO HI 0xa 854,166666666667 (a4) 1005,20833333333 (c1)
значения 854,166666666667 1005,20833333333 динамические, а заменить метасимволом не выход, т.к. эти значения могут быть равны и 1000 и 800 и 65 и т.п.

Офлайн

#4 Июль 19, 2012 12:39:17

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Сравнение строк по маске

Вы хотите сказать, что маску строки нельзя задать регулярным выражением? Какая же это маска тогда?

abogdan
эти значения могут быть равны и 1000 и 800 и 65
'\d+'



Офлайн

#5 Июль 20, 2012 02:41:31

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9874
Репутация: +  854  -
Профиль   Отправить e-mail  

Сравнение строк по маске

>>> import re
>>> 
>>> s = 'MLIST 0x1 0x2 0x3 0x4 0,00 HELLO HI 0xa 854,166666666667 (a4) 1005,20833333333 (c1)'
>>> 
>>> numpat = r'\d+(,\d+)?'
>>> idpat = r'[a-z][0-9]'
>>> 
>>> # MLIST 0x1 0x2 0x3 0x4 * HELLO HI 0xa * (*) * (*)
... pat = 'MLIST 0x1 0x2 0x3 0x4 {num} HELLO HI 0xa {num} ' \
...       '\({iden}\) {num} \({iden}\)$'.format(num=numpat, iden=idpat)
>>> 
>>> m = re.match(pat, s)
>>> if m:
...     print(m.group(0))
... 
MLIST 0x1 0x2 0x3 0x4 0,00 HELLO HI 0xa 854,166666666667 (a4) 1005,20833333333 (c1)
>>>

ещё короче
>>> import re
>>> 
>>> s = 'MLIST 0x1 0x2 0x3 0x4 0,00 HELLO HI 0xa 854,166666666667 (a4) 1005,20833333333 (c1)'
>>> 
>>> # MLIST 0x1 0x2 0x3 0x4 * HELLO HI 0xa * (*) * (*)
... pat = 'MLIST 0x1 0x2 0x3 0x4 {0} HELLO HI 0xa {0} ' \
...       '\({1}\) {0} \({1}\)$'.format(r'\d+(,\d+)?', r'[a-z][0-9]')
>>> 
>>> m = re.match(pat, s)
>>> if m:
...     print(m.group(0))
... 
MLIST 0x1 0x2 0x3 0x4 0,00 HELLO HI 0xa 854,166666666667 (a4) 1005,20833333333 (c1)
>>> 

и яснее
>>> s = 'MLIST 0x1 0x2 0x3 0x4 0,00 HELLO HI 0xa 854,166666666667 (a4) 1005,20833333333 (c1)'
>>> 
>>> # MLIST 0x1 0x2 0x3 0x4 * HELLO HI 0xa * (*) * (*)
... pat = 'MLIST 0x1 0x2 0x3 0x4 {num} HELLO HI 0xa {num} ' \
...       '\({iden}\) {num} \({iden}\)$'.format(
...           num=r'\d+(,\d+)?', iden=r'[a-z][0-9]'
...       )
>>> 
>>> m = re.match(pat, s)
>>> if m:
...     print(m.group(0))
... 
MLIST 0x1 0x2 0x3 0x4 0,00 HELLO HI 0xa 854,166666666667 (a4) 1005,20833333333 (c1)
>>>



Отредактировано py.user.next (Июль 20, 2012 02:51:01)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version