2014-12-22 3 views
0

Я пытаюсь найти конкретную строку в строке и напечатать 10 символов после строки в строке.Python Regex search + Offset

Например:

"Empty user name specified in NTLM authentication. Port=443, Client ip=/10.234.112.164, port=2629. Prompting for auth again." 

Я хочу найти «ф = /» в приведенном выше линии и получить следующие 15 символов. Так эффективно, мне нужно "10.234.112.164," значение.

Я попытался использовать индекс re.search и .end(). Я не уверен, как получить данные.

+2

Добро пожаловать в переполнение стека! Какой шаблон регулярного выражения вы используете, и какие результаты он возвращает? Измените это на свой вопрос. –

ответ

0

Я думаю, что вы хотите, чтобы получить IP-адрес от "входа? Если вы хотите, чтобы получить IP-адрес, должны быть ошибки, если вы ищете". ip =/"в приведенной выше строке и получить следующие 15 символов, потому что IP находится между« xxxx »и« xxx.xxx.xxx.xxx ». Например, если IP 10.24.12.14, результат вы получите (следующий 15 символов) '10 .24.12.14, po ', вы хотите этого?

так что вы должны сделать некоторые изменения:

>>> a = '......in NTLM authentication. Port=443, Client ip=/10.234.112.164, port=2629.' 
>>> b = '......in NTLM authentication. Port=443, Client ip=/10.23.12.14, port=2629.29.' 
>>> c = '......in NTLM authentication. Port=443, Client ip=/1.3.1.1, port=2629.29.' 
>>> d = '......in NTLM authentication. Port=443, Client ip=/110.223.111.211, port=2629.29.' 
>>> re.search(r'ip=\/(\d+.\d+.\d+.\d+)', a).group(1) 
'10.234.112.164' 
>>> re.search(r'ip=\/(\d+.\d+.\d+.\d+)', b).group(1) 
'10.23.12.14' 
>>> re.search(r'ip=\/(\d+.\d+.\d+.\d+)', c).group(1) 
'1.3.1.1' 
>>> re.search(r'ip=\/(\d+.\d+.\d+.\d+)', d).group(1) 
'110.223.111.211' 
0

Вы можете использовать capturing groups.

ip=\/(.{15}) 

() называется захватив группы и {} называемые repitation квантор. Таким образом, .{15} повторяет предыдущий токен . (соответствует любому символу, кроме разрывов строк) ровно 15 раз.

Код:

>>> s = "Empty user name specified in NTLM authentication. Port=443, Client ip=/10.234.112.164, port=2629. Prompting for auth again." 
>>> re.search(r'ip=\/(.{15})', s).group(1) 
'10.234.112.164,' 

ИЛИ

Positive lookbehind assertion.

(?<=ip=\/).{15} 

(?<=ip=\/) называется положительное назад ', который утверждает, что матч должен предшествовать строки ip=/. И шаблон .{15} соответствует ровно 15 символам.

DEMO

Код:

>>> s = "Empty user name specified in NTLM authentication. Port=443, Client ip=/10.234.112.164, port=2629. Prompting for auth again." 
>>> re.search(r'(?<=ip=\/).{15}', s).group() 
'10.234.112.164,' 
0

Вы можете сделать это без регулярных выражений с помощью partition:

>>> s = "Empty user name specified in NTLM authentication. Port=443, Client ip=/10.234.112.164, port=2629. Prompting for auth again." 
>>> s.partition('ip=/')[2].partition(',')[0] 
'10.234.112.164' 

Это просто получает все после ip=/ и до следующей запятой, так это не имеет значения, какова конкретная длина или формат ip-адреса (и если нет ip=/, он вернет пустую строку).

+0

Большое спасибо NeoWu и Avinash Raj. NeoWu, вы получили это ударом по цели. Это было именно то, что я хотел! Но были и другие подобные поиски, которые мне нужно было делать (например, exctracting Usernames из журнала), для которых метод Avinash был бы идеальным! –