>source

아래와 같은 내용의 파일이 있습니다. 파일에서 "-x"옆에있는 단어를 추출하려고하는데 마지막으로 고유 한 결과 만 얻으면됩니다. 그 일부로 아래 정규식을 시도했지만 출력에 작은 따옴표와 큰 따옴표 만 있습니다. 큰 따옴표에만 정규식을 사용할 때 결과를 얻었습니다.

파일 내용

00 04 * * 2-6   testuser   /get_results.sh -q -x 'igp_srm_m' -s 'yesterday' -e 'yesterday' -m '2048' -b >>'/var/log/process/srm-console.log' 2>&1
00 10 * * 2-6   testuser   /get_results.sh -q -x 'igp_srm_m' -s 'yesterday' -e 'yesterday' -m '2048' -w '720' >>'/var/log/process/srm-console.log' 2>&1
00 08 * * 1-5   testuser   /get_results.sh -q -x "igp_france" -s "today" -e "today" -m "90000" -b -z partA >>"/var/log/process/france-partA-console.log" 2>&1
00 12 * * 2-6   testuser   /get_results.sh -q -x "igp_france" -s "yesterday" -e "yesterday" -m "90000" -w "900" -z partA >>"/var/log/process/france-partA-console.log" 2>&1
00 08 * * 1-5   testuser   /get_results.sh -q -x "igp_france" -s "today" -e "today" -m "90000" -b -z partB >>"/var/log/process/france-partB-console.log" 2>&1
00 12 * * 2-6   testuser   /get_results.sh -q -x "igp_france" -s "yesterday" -e "yesterday" -m "90000" -w "900" -z partB >>"/var/log/process/france-partB-console.log" 2>&1
00 12 * * 2-6   testuser   JAVA_OPTS='-server -Xmx512m' /merge.sh "yesterday" "igp_france" "partA,partB" >>"/var/log/process/france-console.log" 2>&1
00 08 * * 1-5   testuser   /get_results.sh -q -x "igpswitz_france" -s "today" -e "today" -m "15000" -b >>'/var/log/process/igpswitz_france-console.log' 2>&1
00 12 * * 2-6   testuser   /get_results.sh -q -x "igpswitz_france" -s "yesterday" -e "yesterday" -m "15000" -Dapc.maxalerts=8000 -w "900" >>'/var/log/process/igpswitz_france-console.log' 2>&1
30 07 * * 2-6   testuser   /get_results.sh -q -x "igp_franced" -s 'yesterday' -e 'yesterday' -m "105000" -b >>"/var/log/process/franced-console.log" 2>&1
15 12 * * 2-6   testuser   /get_results.sh -q -x "igp_franced" -s 'yesterday' -e 'yesterday' -m "105000" -w "960" >>"/var/log/process/franced-console.log" 2>&1

시도한 구문

import re
with open ("test2") as file:
        for line in file:
                try:
                        m=re.search('(?<=\-x (\"|\'))(\w+)',line)
                        print m.group(1)
                except:
                        m = None

예상 출력

igp_srm_m
igp_france
igpswitz_france
igp_franced

수신 된 출력

'
'
"
"
"
"
"
"
"
"

큰 따옴표에 대해서만 시도했을 때 제대로 작동하기 때문에 무엇이 잘못되었는지 확실하지 않습니다.

큰 따옴표 전용 작업 스크립트

import re
with open ("test2") as file:
        for line in file:
                try:
                        m = re.search('(?<=\-x \")(\w*)', line)
                        print m.group(1)
                except:
                        m = None

수신 된 출력-큰 따옴표 만 검색

igp_france
igp_france
igp_france
igp_france
igpswitz_france
igpswitz_france
igp_franced
igp_franced

  • 답변 # 1

    집합을 사용하여 고유 한 값을 가져올 수 있습니다.

    패턴에서 값은 그룹 2에 있지만 패턴을 약간 최적화 할 수 있습니다. 작은 따옴표와 큰 따옴표는 문자 클래스에서 사용할 수 있습니다. (["']) 그룹 1에서 캡처됩니다. 그런 다음 역 참조를 사용하여 \

    -x (["'])(\w+)\1
    
    

    Regex 데모 | Python 데모

    import re
    result = set()
    with open ("test2") as file:
        for line in file:
            try:
                m = re.search(r"-x ([\"'])(\w+)\1", line)
                result.add(m.group(2))
            except:
                m = None
    print(result)
    
    

    산출

    {'igp_france', 'igp_srm_m', 'igp_franced', 'igpswitz_france'}
    
    

  • 답변 # 2

    m=re.search('(?<=\-x (\"|\'))(\w+)',line)
    print m.group(1)
    
    

    group (1) 대신 group (2)를 사용하십시오. 원래,

    m=re.search('(?<=\-x (\"|\'))(\w+)',line)
    print m.group(2)
    
    

    https://regex101.com/에서 시도한 결과 그룹 1은 ' , 그룹 2를 사용하면 필요한 출력이 제공됩니다.

    필요한 출력이 이미 그룹 1에 있으므로 큰 따옴표 1이 올바르게 작동합니다.

  • 이전 firebase - ListViewbuilder를 사용하여 특정 컬렉션의 특정 Firestore 문서를 가져 오는 방법
  • 다음 각도 formbuilder 유효성 검사