2015-10-06 6 views
1

В настоящее время я создаю игру Ansible, которая включает в себя добавление определенного диапазона портов в конфигурационный файл CSF.Python Regex не соответствует, если слово в строке

Строка в файле выглядит следующим образом:

TCP_IN = "20,21,22,25,53,80,110,143,443,465,587,993,995,2077,2078,2082,2083,2086,2087,2095,20960" 

мне нужно регулярное выражение, которое будет соответствовать строку, начинающуюся с «=» TCP_IN только ЕСЛИ она не содержит диапазон портов уже. Например. это должно соответствовать:

portrange = 3000:5000 

TCP_IN = "20,21,22,25,53,80,110,143,443,465,587,993,995,2077,2078,2082,2083,2086,2087,2095,20960" 

Но это не должно соответствовать:

TCP_IN = "20,21,22,25,53,80,110,143,443,465,587,993,995,2077,2078,2082,2083,2086,2087,2095,20960,3000:5000" 

И то же время верно, если диапазон портов появляется в начале или в середине строки.

Есть ли способ сделать это?

+0

Почему вы хотите использовать для этого регулярные выражения? – jonrsharpe

+0

Предполагаются ли цифры в одной строке или на следующей строке? –

+0

@jonrsharpe -> Я использую модуль 'lineinfile' от Ansible, который нуждается в регулярном выражении и использует регулярное выражение Python. В принципе, если 3000: 5000 не существует, оно должно добавить его в строку. Если он существует, он не должен найти эту строку. Таким образом, это только добавление, когда оно не существует. – Skowt

ответ

1

Вы можете попробовать это отрицательное опережения регулярное выражение на основе:

\bTCP_IN\s+=\s+"(?![\d,:]*?\b3000:5000\b)[\d,:]+" 

RegEx Demo

В использовании питона:

regex = re.compile(ur'\bTCP_IN\s+=\s+"(?![\d,:]*?\b3000:5000\b)[\d,:]+"') 

Regex не делает каких-либо проверки портов, он просто позволяет цифр или запятой или двоеточием на входе.

+1

Просто проверил это и может подтвердить, что он работает так, как должен. Если кому-то интересно, это адаптированная строка, как у меня в моем коде. 'lineinfile: dest =/etc/csf/csf.conf state = present regexp = '\ bTCP_IN \ s + = \ s +" ((?! [\ d,:] *? \ b {{newRange}} \ b) [ \ d,:] +) 'line =' TCP_IN = "\ 1, {{newRange}}" 'backrefs = yes backup = yes' – Skowt

Смежные вопросы