Три разделенных подчеркиванием элемента составляют мои строки:
- сначала (буквы и цифры)
- средний (буквы, цифры и подчеркивание)
- последний (буквы и цифры)
Последний элемент является необязательным.
Примечание: мне нужно получить доступ к своим группам по их именам, а не по их индексам.
Примеры:
String : abc_def
first : abc
middle : def
last : None
String : abc_def_xyz
first : abc
middle: def
last: xyz
String : abc_def_ghi_jkl_xyz
first : abc
middle : def_ghi_jkl
last : xyz
Я не могу найти правильное регулярное выражение ...
Пока у меня есть две идеи:
Дополнительная группа
(?P<first>[a-z]+)_(?P<middle>\w+)(_(?P<last>[a-z]+))?
Но средняя группа совпадает до конца строки:
String : abc_def_ghi_jkl_xyz
first : abc
middle : def_ghi_jkl_xyz
last : vide
Использование '|'
(?P<first>[a-z]+)_(?P<middle>\w+)_(?P<last>[a-z]+)|(?P<first>[a-z]+)_(?P<middle>\w+)
Это выражение недопустимо: первая и средняя группы объявляются два раза. Хотя я мог бы написать выражение, повторно используя соответствующую группу из первой части выражения:
(?P<first>[a-z]+)_(?P<middle>\w+)_(?P<last>[a-z]+)|(?P=first)_(?P=middle)
Выражение допустимо, однако строки с первым и средним, как abc_def, не совпадают.
Примечание
Эти строки на самом деле являются частями пути, который мне нужно сопоставить. Это могут быть пути вроде:
- / мой / путь / к / abc_def
- / мой / путь / к / abc_def /
- / мой / путь / к / abc_def / некоторые / другие / Stuf
- / мой / путь / к / abc_def / некоторые / другие / Stuf /
- / мой / путь / к / abc_def_ghi_jkl_xyz
- / мой / путь / к / abc_def_ghi_jkl_xyz /
- / мой / путь / к / abc_def_ghi_jkl_xyz / некоторые / другие / Stuf
- / мой / путь / к / abc_def_ghi_jkl_xyz / некоторые / другие / Stuf /
- ...
Есть идеи решить мою проблему исключительно с помощью регулярных выражений? Постобработка сопоставленных групп невозможна.
Большое спасибо!