>source

정규식 = ^(movie|tv) (.*) (?<=season )([0-9 ]+)

입력 = tv game of thrones season 1 2 3

산출

tv
game of thrones season
1 2 3

원하는 출력

tv
game of thrones
1 2 3

https://regex101.com/r/wG3aM3/954

(.*) 이전의 모든 문자열을 캡처합니다. ([0-9 ]+) 캡처를 방지하려면 어떻게해야합니까 (?<=season ) 이전입니다 ([0-9 ]+) .

추신 : "시즌"을 부정 할 수 없습니다. (.*) . 즉 tv game of season season 1 2 3 캡처해야 tv game of season 1 2 3

  • 답변 # 1

    당신이 사용할 수있는

    ^(movie|tv)\s*(.*?)(?:\s+season)?(?:\s+([0-9]+(?:\s+[0-9]+)*))?$
    
    

    정규식 데모를 참조하십시오.

    세부

    ^ -문자열 시작

    (movie|tv) -그룹 1 : movie 또는 tv

    \s* -0 개 이상의 공백

    (.*?) -그룹 2 : 가능한 한 적은 줄 바꿈 문자를 제외한 0 개 이상의 문자

    (?:\s+season)? -하나 이상의 공백과 일치하는 선택적 비 캡처 그룹 season

    (?:\s+([0-9]+(?:\s+[0-9]+)*))? -선택적 비 캡처 그룹 일치

    \s+ -하나 이상의 공백

    ([0-9]+(?:\s+[0-9]+)*) -그룹 3 : 하나 이상의 숫자 뒤에 하나 이상의 공백 문자가 0 개 이상 반복되고 하나 이상의 숫자가 이어짐

    $ -문자열 끝.

  • 답변 # 2

    이건 어때?

    ^(movie|tv) (.*) (?:season )([0-9 ]+)
    
    

    이것은 예견 (?<= season)을 비 캡처 그룹 (? : season)으로 변경합니다. 파이썬에서는 다음과 같습니다.

    import re
    text = "tv game of thrones season 1 2 3"
    output = re.findall(r"^(movie|tv) (.*) (?:season )([0-9 ]+)", text)
    print(output)
    #output: [('tv', 'game of thrones', '1 2 3')]
    
    

    A non-capturing version of regular parentheses. Matches whatever regular expression is inside the parentheses, but the substring matched by the group cannot be retrieved after performing a match or referenced later in the pattern.

    https://docs.python.org/3/library/re.html 참조

  • 이전 R Shiny 앱의 서버 기능 내에서 easyButton 상태 변경
  • 다음 javascript - 반응에서 숫자 추측