2014-11-13 6 views
0

필드의 각 행에있는 텍스트가 특정 형식을 따르는 지 확인하는 스크립트를 작성하고 있습니다. 또한 각 체크 된 레코드/행에 대해 결과를 인쇄하기를 원합니다.검색 커서 및 re.compile을 사용하여 텍스트 패턴 확인

텍스트 형식은 다음과 같습니다

000-00-0 NN 00 

그래서 오타 행, 스크립트가 인쇄해야 다른 사람과 같은 00-00-0 NN 00 또는 000 00 0-NN 0 또는 아무것도가있는 경우 : "feature (feature #) does not match the pattern"가.

아래는 내 스크립트입니다. 오류없이 작동하지만 올바른 결과를 제공하지는 않습니다. 현재 일치하지 않는 필드의 모든 기능을 표시하지만 실제로는 대부분 일치합니다! 나는

with arcpy.da.SearchCursor(inFC, field) as rows: 
for row in rows: 
    if row[0] == re.compile("^([0-9]{3})[a-]([0-9]{2})[a-]([0-9]{1})[\s]([NESW]{2})[\s]([0-9]{2})*$"): 
     arcpy.AddWarning("Feature {0} matches the pattern") 
    else: 
     arcpy.AddMessage("Feature {0} does not match the pattern") 
del row, rows 

답변

1

re.compilepre-compiled regular expression object를 생성 ... 여기 아주 간단한 뭔가 빠진해야합니다. 평등을 위해 그것을 테스트하는 것은 결코 작동하지 않을 것입니다. 정규식 개체 here에 대한 설명서를 참조하십시오.

re.compile 호출을 for 루프 외부로 이동하고 객체를 다시 사용해야합니다. 자주 사용되는 정규식 패턴을 미리 컴파일하면 상당한 성능 향상을 얻을 수 있지만 루프를 수행 할 때마다 다시 컴파일하면 모든 패턴을 잃을 가능성이 있습니다.

예는 :

pattern = re.compile(
    "^([0-9]{3})[a-]([0-9]{2})[a-]" 
    "([0-9]{1})[\s]([NESW]{2})[\s]([0-9]{2})*$" 
) 

for row in rows: 
    if pattern.match(row[0]): 
     arcpy.AddWarning("Feature {0} matches the pattern") 
+0

감사합니다! 나는 스크립팅을하는 초심자이기 때문에 나를 위해 배울 점이 많이 남아있다. –