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

У меня есть следующее регулярное выражение: (?i)p\w+@t(-)?\w+(-\w+)?(\.\w+)?\.at, которое соответствует данным, например

[email protected]
[email protected]

Как я могу переписать это регулярное выражение, чтобы использовать группы без захвата?

  • [?i]p\w+@t[-]?\w+[-\w+]?[\.\w+]?\.at больше не будет соответствовать результатам
  • (?:?i)p\w+@t(?:-)?\w+(?:-\w+)?(?:\.\w+)?\.at то же самое здесь

т.е. (?i)p должен быть доступен для записи как ?ip Я думаю, но на https://regex101.com я получаю ошибки только при попытке использовать (?:?i)p\w+@t(?:-)?\w+(?:-\w+)?(?:\.\w+)?\.at с незахватывающими группами.

В конце python3 должен оценить регулярное выражение.


person Georg Heiler    schedule 17.05.2017    source источник
comment
Ваше выражение работает — просто поместите модификатор вне выражения или используйте (?i)p\w+@t(?:-)?\w+(?:-\w+)?(?:\.\w+)?\.at   -  person Jan    schedule 17.05.2017


Ответы (2)


Первая «группа», (?i), не является группой захвата, это установленный флаг, включающий нечувствительность к регистру для выражения. Версия без захвата должна быть:

(?i)p\w+@t-?\w+(?:-\w+)?(?:\.\w+)?\.at

Что соответствует правильно.

person Adrian    schedule 17.05.2017
comment
Это включается в самый первый раздел панели ОБЪЯСНЕНИЕ, когда вы вставляете свое исходное выражение в regex101, сайт, который вы упомянули: (?i) сопоставьте оставшуюся часть шаблона со следующими действующими флагами: модификатор gi i: нечувствителен. Соответствие без учета регистра (игнорирует регистр [a-zA-Z]) - person Adrian; 17.05.2017
comment
За рыбу +1 ;-) - person Jan; 17.05.2017

Вы можете использовать

(?i)p\w+@t(?:-)?\w+(?:-\w+)?(?:\.\w+)?\.at

См. демонстрацию на сайте regex101.com.
Как как указывали другие, (?i) является встроенным модификатором, как и (?s) (однострочный) или (?m) (многострочный).

person Jan    schedule 17.05.2017
comment
Нет объяснения, почему это работает, а оригинал нет? - person Adrian; 17.05.2017