re.match работает через командную строку, но терпит неудачу при запуске через скрипт

#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] )’