2009-04-11 5 views
1

이 질문은 정규 표현식 하나와 일치하는 대신 정규 표현식과 일치하지 않는 것을 확인하고 일치하는 항목이없는 경우를 제외하고는 "How to concisely cascade through multiple regex statements in Python"과 비슷합니다 (일명 나는 유효한 데이터를 가지고있다.) 그런 다음 무언가를하라. 나는 그것을 할 수있는 방법을 찾았지만 더 좋은 방법이 있어야한다고 생각하고 있습니다. 특히 많은 정규 표현식으로 끝나면 더욱 그렇습니다.Python에서 표현식에 여러 음수 정규 표현식 적용

기본적으로 HTML 문서에서 유효한 URL처럼 보이지만 (JavaScript, 그래서 평가해야 할 필요가 있으므로 이스케이프 문자가 필요합니다. 나는 아름다운 페이지를 처리 ​​할 수 ​​없습니다. 실제로는 BeautifulSoup을 사용하고 나서 추악하지만 실행 가능한 파서로 돌아갑니다.

지금까지 나는 다음과 같은 연구를 비교적 잘 수행했다. 주 루프 외부에서 dict 나 정규 표현식을 컴파일했다. (그래서 컴파일을 한 번만하면되지만 속도를 사용할 때마다 이익을 얻는다. 이 dict를 통한 URL, 일치하는 항목이있는 경우 URL이 좋지 않으면 URL이 적합하지 않음 :

0 의 수를 줄일 수

re.compile('(\"\"|\\\")') 

비교하고 이것 저것 : | :

regex_bad_url = {"1" : re.compile('\"\"'), 
       "2" : re.compile('\\\"')} 

다음에 예 ("")

url_state = "good" 

for key, pattern in regex_bad_url_components.items(): 
    match = re.search(pattern, url) 
    if (match): 
     url_state = "bad" 

if (url_state == "good"): 
# do stuff here ... 

지금 분명한 생각은 정규식을 사용 "또는"하는 것입니다 ,하지만 문제 해결에 훨씬 더 어려워집니다. (비교 당 하나의 표현을 사용하면 다음과 같은 프린트 문을 쉽게 추가 할 수 있습니다 :

print "URL: ", url, " matched by key ", key 

두 가지 모두에서 최상의 결과를 얻을 수있는 방법이 있습니까? 비교의 최소 숫자) 아직 URL을 일치하는 정규식을 인쇄 할 수 있을까요? 아니면 간단히 글 머리 기호를 물어야하고 코드를 디버깅 할 때 문제를 해결하기가 더 쉽지만 모든 정규식을 하나의 줄로 묶어야합니다. 생산? (이는 프로그래밍 및 코드 유지 관리 및 가능한 문제의 한 단계 더 나아간 것을 의미합니다).

업데이트 :

데이브 웹이에 의해

좋은 대답이에 대한 실제 코드는 같을 것이다, 그래서 :

match = re.search(r'(?P<double_quotes>\"\")|(?P<slash_quote>\\\")', fullurl) 
if (match == None): 
    # do stuff here ... 
else: 
    #optional for debugging 
    print "url matched by", match.lastgroup 

답변

2

"Squoosh"모든 정규 표현식에 하나 개의 라인으로 만 사용 명명 된 그룹에 각각 넣어 (?P<name>...) 다음 MatchOjbect.lastgroup을 사용하여 일치하는 것을 찾으십시오.