2016-08-11 4 views
0

많은 메타 문자가있는 패턴을 검색해야합니다. 현재 긴 정규식을 사용합니다.파이썬에서 모든 메타 문자를 이스케이프 처리합니다.

prodObjMatcher=re.compile(r"""^(?P<nodeName>[\w\/\:\[\]\<\>\@\$]+)""", re.S|re.M|re.I|re.X) 

나는 하나의 재 컴파일에 같은 패턴의 조합을 작성해야 할 때 특히 고통스러운 (내 실제 패턴은 매우 긴 그래서 난 그냥 내가 도움을 필요로하는 몇 가지 관련 부분을 붙여).

패턴 길이를 줄이기위한 파이썬 방법이 있습니까?

+1

빈 문자열과 일치하는 경우 끝에'. *?'를 사용하는 이유는 무엇입니까? 또한,'^','-',']'및''\''를 제외하고는 문자 클래스에서 문자를 이스케이프 할 필요가 없습니다. 문자 클래스에서 이스케이프 처리되지 않은 문자들 (''\''제외)도 유지할 수있는 방법이 있습니다. –

+2

주석 외에도'xml' ** 구문 분석 ** (노드 이름 ???)과 같은 냄새가납니다. – Jan

+0

@ WiktorStribiżew *** 실제 패턴이 매우 길어서 도움이 필요한 부분을 붙여 넣었습니다. *** 질문에 대한 답을 얻는 것이 좋을까요? 나는 아직 파이썬에서 정규식에 대한 전문가가 아니므로 일반적으로 메타 문자를 이스케이프 처리합니다. 아마도 탈출 할 시간과없는 탈출구를 배울 것입니다. –

답변

2

봐는, 당신의 패턴은 당신이 이제까지 속기 클래스, ^, -, ]을 제외하고는 문자 클래스의 모든 비 단어 문자를 이스케이프 할 필요가 없습니다

r"""^(?P<nodeName>[]\w/:[<>@$]+).*?""" 

참고로 감소 될 수 있으며, \. 도 (\ 제외) 그 캐릭터 클래스에 이스케이프 유지하는 방법은 다음과 같습니다

문자 클래스
  • ^의 시작/끝의 문자 클래스
  • -의 시작
    • ] - 문자 클래스의 시작 부분에 리터럴 기호로 배치하는 경우에만 이스케이프해야합니다.
    • 문자 클래스 외부

    , 당신은 \, [, (, ), +, $, ^, *, ?, .을 탈출해야합니다.

    /은 파이썬 정규식 패턴에서 특별한 정규식 메타 문자가 아니며 이스케이프 할 필요가 없습니다.

    문제를 피하기 위해 정규식 패턴을 정의 할 때 원시 문자열 리터럴을 사용하십시오 (예 : 단어 경계 r'\b' 및 백 스페이스 '\b' 혼동).

  • +1

    감사합니다. 유용한 정보입니다. –

    관련 문제