Как использовать отрицательный взгляд сзади - PullRequest
0 голосов
/ 13 августа 2011

По сути, я изменяю все шестнадцатеричные значения с голубым оттенком на его аналог красного оттенка в данной таблице стилей (т. Е. #00f изменяется на #ff0000 (моя функция выводит шестнадцатеричные шестизначные значения, кроме #)).

Создание регулярного выражения для соответствия шестнадцатеричным цветам не было проблемой (меня не волнуют названия цветов HTML, хотя мне может в конечном итоге заботиться о rgb, rgba, hsb и др. Значения.).Это то, что я закончил с #(([0-9A-z]{3}){1,2}).Это работает, но я хочу, чтобы это было полным доказательством.Например, если кто-то устанавливает фоновое изображение с фрагментом (например, #top) с допустимым шестнадцатеричным значением, я не хочу его менять.Я пытался сделать отрицательный взгляд назад, но это не сработало.Я был , используя \B#(([0-9A-z]{3}){1,2}), но если перед '#' стоит граница слова (например, пробел), это соответствует фрагменту URL.Это то, что, как я думал, должно сработать, но это не так: (?<!url\([^#)]*)#(([0-9A-z]{3}){1,2}).

Я использую настольную версию RegExr для тестирования со следующей таблицей стилей:

body {
    background: #f09 url('images#06F');
}
span {
    background=#00f url('images#889');
}
div {
    background:#E4aaa0 url('images#889');
}
h1 {
    background: #fff #dddddd;
}

Всякий раз, когда я нахожу указатель мыши на подстроку (?<!, RegExr определяет ее как «Отрицательный взгляд впереди , соответствующий 'url\([^#)]*'».Может ли быть ошибка или у меня просто плохой день регулярных выражений?И в то время как мы находимся в этом, есть ли другие контексты, в которых '#' используется для не шестнадцатеричных целей?

РЕДАКТИРОВАТЬ: Хорошо, я не могу программировать рано утром.Это шестнадцатеричное регулярное выражение должно быть #(([0-9A-Fa-f]{3}){1,2})

РЕДАКТИРОВАТЬ 2: Хорошо, поэтому я упустил детали, что большинству языков требуются объекты со статической длиной.

1 Ответ

0 голосов
/ 13 августа 2011

Я думаю, что вам нужно либо одно из следующих решений, либо другое

ss = '''    background: #f09 url('images#06F'); 
    background=#00f url('images #889'); 
    background:#E4aaa0 url('images#890'); 
    background: #fff #dddddd; '''

print ss
import re

three = '(?:[0-9A-Fa-f]{3})'

regx = re.compile('^ *background[ =:]*#(%s{1,2})' % three,re.MULTILINE)
print regx.findall(ss)

print '-----------------------------------------------------'

regx = re.compile('(?:(?:^ *background[ =:]*)|(?:(?<=#%s)|(?<=#%s%s)) +)'
                  '#(%s{1,2})' % (three,three,three,three),
                  re.MULTILINE)
print regx.findall(ss)

результат

    background: #f09 url('images#06F'); 
    background=#00f url('images #889'); 
    background:#E4aaa0 url('images#890'); 
    background: #fff #dddddd; 
['f09', '00f', 'E4aaa0', 'fff']
-----------------------------------------------------
['f09', '00f', 'E4aaa0', 'fff', 'dddddd']

Изменить 1

ss = '''    background: #f09 url('images#06F'); 
    background=#00f url('images #889'); 
    color:#E4aaa0 url('images#890'); 
    background: #fff #dddddd#125e88    #ae3;
    Walter (Elias) Disney: #f51f51 '''

print ss+'\n'

import re

three = '(?:[0-9A-Fa-f]{3})'

regx = re.compile('^ *[^=:]+[ =:]*#(%s{1,2})' % three,re.MULTILINE)
print regx.findall(ss)

print '-----------------------------------------------------'

regx = re.compile('(?:(?:^ *[^=:]+[ =:]*)|(?:(?<=#%s)|(?<=#%s%s)) *)'
                  '#(%s{1,2})' % (three,three,three,three),
                  re.MULTILINE)
print regx.findall(ss)

результат

    background: #f09 url('images#06F'); 
    background=#00f url('images #889'); 
    color:#E4aaa0 url('images#890'); 
    background: #fff #dddddd#125e88    #ae3;
    Walter (Elias) Disney: #f51f51 

['f09', '00f', 'E4aaa0', 'fff', 'f51f51']
-----------------------------------------------------
['f09', '00f', 'E4aaa0', 'fff', 'dddddd', '125e88', 'ae3', 'f51f51']

Редактировать 2

ss = '''    background: #f09 url('images#06F'); 
    background=#00f url('images #889'); 
    color:#E4aaa0 url('images#890'); 
    background: #fff #dddddd#125e88    #ae3;
    Walter (Elias) Disney: #f51f51
    background: -webkit-gradient(linear, from(#000000), to(#ffffff));. '''

print ss+'\n'

import re

three = '(?:[0-9A-Fa-f]{3})'

preceding = ('(?:(?:^[^#]*)'
                 '|'
                 '(?:(?<=#%s)'
                     '|'
                     '(?<=#%s%s)'
                     '|'
                     '(?<= to\()'
                     ')'
                 ')') % (three,three,three)

regx = re.compile('%s *#(%s{1,2})' % (preceding,three), re.MULTILINE)
print regx.findall(ss)

результат

    background: #f09 url('images#06F'); 
    background=#00f url('images #889'); 
    color:#E4aaa0 url('images#890'); 
    background: #fff #dddddd#125e88    #ae3;
    Walter (Elias) Disney: #f51f51
    background: -webkit-gradient(linear, from(#000000), to(#ffffff));. 

['f09', '00f', 'E4aaa0', 'fff', 'dddddd', '125e88', 'ae3', 'f51f51', '000000', 'ffffff']

Регулярные выражения чрезвычайно мощны при условии, что после определенной организации должно быть достаточно частей строкотносительная стабильность среди переменных других частей, которые предназначены для улавливания.Если анализируемый текст становится слишком рыхлым по своей структуре, становится невозможным написать регулярное выражение.

Есть ли еще много других структур типа "арлекинового пэчворка", возможных для ваших строк ??

...