#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, чтобы опробовать ваше регулярное выражение.