Мне нужно извлечь из предложений несколько групп слов. Предложения примерно такие:
I want to see Coldplay
I want to see Rise Against in New York
Я хочу извлечь всю строку после see, но хочу остановиться, если появится слово in.
see (?P<band>[\w\s]+) соответствует Coldplay, но соответствует Rise against in New Yorksee (?P<band>[\w\s]+?) соответствует C и Rsee (?P<band>[\w\s]+?) (?=in) соответствует Rise Against, но не соответствует другим предложениямsee (?P<band>[\w\s]+?) (?=in)? не допускаетсяsee (?P<band>[\w\s]+?)(?: in)? соответствует C и RКак сюда идти?
В конечном итоге ваше условное «in» можно заменить на (?= in|$), чтобы он обнаруживал «in» или конец строки, чтобы решение 3 работало. Но, кстати, как вы планировали себя вести с названиями групп с "внутри" внутри?





I want to extract everything of the string after "see" but I want to stop if the word "in" appears.
это может помочь:
(?P<band>(?<=see)(.(?!in ))*)
Ваш третий пример может вернуть ожидаемое совпадение, если вы немного его измените:
see (?P<band>.+?)(?= in|$)
Это означает, что вы должны обеспечить соответствие конечной границы. Попробуйте также:
see (?P<band>.*?)(?: in\b|$)
или же:
see (?P<band>(?:(?! in\b).)*)
Для первых двух регулярных выражений необходимо включить флаг m.
Если вы хотите сопоставить только символы слова и символы пробела, вы можете использовать что-то вроде этого:
see (?P<band>[\w\s]+?)(?= in|[^\w\s]|$)
Если, с другой стороны, [\w\s] не был предназначен, и вы действительно хотите сопоставить что-либо между see и in, вы можете обратиться к Рево ответ.
Редактировать:
Также кажется, что вы не хотите включать see в матч. Если это так, вы можете использовать Lookbehind, поэтому приведенный выше шаблон будет выглядеть примерно так:
(?<=see )(?P<band>[\w\s]+?)(?= in|[^\w\s]|$)
Попробуйте
see (?P<band>.*?)(?: in\b|$)