нужна помощь регулярное выражение необязательно

#python #regex

#python #регулярное выражение

Вопрос:

приведенный ниже код отлично работает, если имя пользователя существует, но что, если вместо него есть «-» (без имени пользователя)

 (?P<host>d{3}.d{3}.d{3}.d{3}) - (?P<user_name>w*) [(?P<time>.*?)] "(?P<request>.*?)" 
  

имя пользователя существует:

 146.204.224.152 - feest6811 [21/Jun/2019:15:45:24 -0700] "POST /incentivize HTTP/1.1" 302 4622
  

нет имени пользователя:

 159.253.153.40 - - [21/Jun/2019:15:46:10 -0700] "POST /e-business HTTP/1.0" 504 19845
  

Комментарии:

1. Заключите необязательную часть в необязательную группу без захвата, part => (?:part)? .

2. Это не необязательное поле.

Ответ №1:

Поле не является необязательным, оно всегда есть. Но иногда он содержит имя пользователя, в других случаях он содержит - . Так что просто используйте альтернативы с | в регулярном выражении, чтобы соответствовать любому из них.

Кроме того, w* позволит использовать полностью пустое имя пользователя, что, вероятно, недопустимо. Используется w для сопоставления с непустым полем.

 (?P<host>d{3}.d{3}.d{3}.d{3}) - (?P<user_name>w |-) [(?P<time>.*?)] "(?P<request>.*?)" 
  

Ответ №2:

Вы также можете попробовать отредактировать свое регулярное выражение, чтобы оно соответствовало - случаю, например:

 (?P<host>d{3}.d{3}.d{3}.d{3}) - (?P<user_name>w*|-) [(?P<time>.*?)] "(?P<request>.*?)"
  

Я использовал Debuggex, чтобы опробовать ваше регулярное выражение.