Я пытаюсь прочитать названия фильмов и годы. Схема выглядит следующим образом:
name (year)
. В названии фильма могут быть самые разные символы. И я придумал такую схему:
^(?P<name>.*) \((?P<year>\d*)\)
Однако не все фильмы идут с годом после них, поэтому я хотел бы сделать группу year
необязательной, чтобы она возвращала пустую, если есть только название фильма.
Я знаю, что могу сделать год необязательным с помощью ?
, но тогда он станет частью группы name
.
Ваша первая часть слишком жадная. Если вы сделаете вторую часть необязательной, она будет соответствовать всем. Итак, *
→ *?
Затем вы можете использовать необязательную группу без захвата в течение года. И не забудьте отметить конец:
^(?P<name>.*?)(?: \((?P<year>\d*)\))?$
https://regex101.com/r/zTZd9a/2
Спасибо! Кажется, это делает работу. Однако есть ли способ для группы year
вернуть пустое совпадение, если в строке нет года?
Это было бы возможно, но сложно из-за окружающих скобок. Я бы справился с этим в коде.
@Клаус Д. Спасибо за ответ; вновь открыт.