#python #regex
#python #регулярное выражение
Вопрос:
Итак, у меня есть скрипт, который анализирует журнал доступа tomcat, а затем сопоставляет каждую строку с шаблоном регулярных выражений. Теперь, если я запускаю регулярное выражение через командную строку (вызывая интерпретатор python3 с использованием python3 на терминале) в соответствующей строке из этого журнала, я получаю совпадение, однако, если я запускаю скрипт, используя то же регулярное выражение, я получаю nada. Не уверен, почему.
Вывод из командной строки:
>>> obj = re.compile(r'''(?P<bytes_32>[a-z/?=0-9] )
... (?P<PeerS>x0a5a906a)
... (?P<MsTimestamp>Z([a-f0-9] |[0-9] ))
... (?P<RemotePort>AB([0-9] ))
... (?P<RemoteIP>A([0-9.] ){4})
... (?P<PeerIP>C([0-9.] ){4})
... (?P<PeerPort>D[0-9] )
... (?P<LocalIP>E([0-9.] ){4})
... (?P<LocalPort>F[0-9] )
... (?P<HostHeader>w[a-z._0-9-] )
... (?P<ContentType>K[a-z/] )
... (?P<Method>m[A-Z] )
... ''', re.VERBOSE)
>>>
>>> string = "0a5a906a57f41c6c00002ee0ffffffff/abcd/api/v1//examples/1348646x0a5a906aZ726AB46151A11.47.166.200C11.47.166.200D46151E11.47.166.200F8443wexamples-api-nobody.corp.myself.comKapplication/jsonmGET"
>>> match = obj.match(string)
>>> print(match)
<_sre.SRE_Match object; span=(0, 195), match='0a5a906a57f41c6c00002ee0ffffffff/screenr/api/v1//>
Вывод через скрипт:
line,obj: 0a5a906a57f41c6c00002ee0ffffffff/abcd/api/v1//examples/1348646x0a5a906aZ726AB46151A11.47.166.200C11.47.166.200D46151E11.47.166.200F8443wexamples-api-nobody.corp.myself.comKapplication/jsonmGET
re.compile('(?P<bytes_32>[a-z/\?=0-9] )n (?P<PeerS>x0a5a906a)n (?P<MsTimestamp>Z([a-f0-9] |[0-9] ))n (?P<RemotePort>AB([0-9] ))n , re.VERBOSE)
match is: None
Почему существует разница в интерпретаторе и скрипте, когда я использую один и тот же ввод и шаблон для обоих?
Комментарии:
1. Вы уверены, что в начале нет пробелов? Попробуйте то же регулярное выражение с
re.search
2. Вы не показали скрипт. Когда я вставил ваш интерактивный сеанс (который вы показали) в скрипт и удалил «>>>» и «….», все сработало нормально.
3. Хотя совпадение было натянутым
span=(0, 192)
. не конечная точка 195, которую показал ваш вывод.len(string)
на самом деле в том, что вы опубликовали, 192, так что в том, что вы опубликовали, что-то не так.4. На самом деле проблема была не в коде или интерпретаторе, поскольку оказалось, что в журнал добавлялись некоторые дополнительные символы типа ^A и ^E. И хотя они, похоже, не отображались в выводе на печать, они были встроены в файл журнала, поэтому, когда я удаляю их из одной из строк, мое регулярное выражение работает просто отлично.
5. obj = re.compile(r'(?P<байт_32>[a-z/?=0-9] )’ r'(?P<PeerS>x0a5a906a)’ r'(?P<MsTimestamp>Z[a-f0-9] )’ r'(?P<Удаленный порт> AB[0-9] ) ‘r'(?P<Удаленный IP>A[0-9] .[0-9] .[0-9] .[0-9] )’ r'(?P<PeerIP>C[0-9] .[0-9] .[0-9] .[0-9] )’ r'(?P<PeerPort>D[0-9] )’r'(?P<localIP>E[0-9] .[0-9] .[0-9] .[0-9] )’