2017-05-19 1 views
1

정규식을 사용하여 문자열의 패턴과 일치 시키려고했습니다. 아이디어는 이것입니다.격자의 더하기 기호 일치

각 항목에는 G와 N이 아닌 크기가 n * m 인 배열이 있습니다. 나는 G의 패턴을 플러스 기호 (+)의 형태로 찾아야하며, 네 개의 팔을 모두 같은 크기로 만들어야합니다. 예를 들어, 예제에서 아래 : 나는 정규식을 사용하여 패턴을 해결하기 위해 노력 1.

BGBBGB 
GGGGGG 
BGBBGB 
GGGGGG 
BGBBGB 
BGBBGB 

BGB 
GGG 
BGB 

그러나, 크기의 각 팔 더하기 기호 (+)의 한 형태입니다, 그것은하지 않았다 나를 위해 운동.

은 수평축에서 동일한 팔 길이의 패턴과 일치하고, 중심에서 G를 갖는다. 4면 모두에서 G의 패턴을 동일한 팔 길이와 일치시키는 방법을 모릅니다. 답변을 주시면 감사하겠습니다.

답변

0

정규 표현식은 1 차원 배열에서 사용할 때 유용하며 2 차원 배열에서는 사용하지 않는 것이 좋습니다. 그래서

나는 정규 표현식을 사용하는 것은 좋은 방법이되지 않을 수도 있다고 경향이 ... 난 각각의 팔은 1 개 단위 길이 인하는 + 패턴으로 G의 배치와 고정 된 패턴과 일치하는 시도 :

B = 0 
G = 1 

matrix = (
    (B, G, B, B, G, B), 
    (G, G, G, G, G, G), 
    (B, G, B, B, G, B), 
    (B, G, B, B, G, B), 
    (G, G, G, G, G, G), 
    (B, G, B, B, G, B), 
) 

pattern = (
    (B, G, B), 
    (G, G, G), 
    (B, G, B), 
) 

def getMatrixSize(mat): 
    # Return (width, height) 
    return (len(mat[0]), len(mat)) 

def findPattern(mat, pat): 
    matches = [] 

    matsize = getMatrixSize(mat) 
    patsize = getMatrixSize(pat) 

    for y in range(matsize[1] - patsize[1] + 1): 
     for x in range(matsize[0] - patsize[0] + 1): 

      submat_cols = mat[y:y+patsize[1]] 
      for i in range(patsize[1]): 
       submat_row = submat_cols[i][x:x+patsize[0]] 
       if submat_row != pat[i]: 
        i = -1 
        break 

      if i > 0: 
       matches.append((x, y)) 

    return matches 

# Run the thing 
print(findPattern(matrix, pattern)) 

내 생각 지금이 좀 "하드 코딩"는입니다 ...

을 매트릭스를 통해 패턴을 밀어 매트릭스 패턴의 각 세그먼트의 각 하위 세그먼트에 비교하는 특정 패턴.
하지만 당신은 항상이에서 가서 (다른 팔 길이)

패턴이 발전 할 수 있도록 시도 할 수 : A가 공유 될 경우 정규 표현식, 당신은 \w{A}.\w{A}처럼 뭔가를 할 수 없다는 것을 문제 카운터 ... 적어도 나는 그것에 대해 들어 본 적이 없다.

0

정규식을 사용하는 대신이 문제를 해결하기 위해 매트릭스와 같은 방법을 사용하기로했습니다. 예를 들어, l은 데이터의 각 행을 포함하는 목록 형식이라고 가정합니다.

import pandas as pd 
import numpy as np 


def findPlusSigh(data, pattern): 
    # Find indexes which match the pattern 
    data = data == pattern 
    pattern_index = data.nonzero() 
    # List to store result 
    result = [] 
    center_index = [] 
    # Loop over each matched element 
    for i, j in zip(pattern_index[0], pattern_index[1]): 
     # Look for arm length from 1 to 100 
     for m in range(1, 100): 
      try: 
       # Break the loop if it's out of range of the data 
       if m > i or m > j: 
        break 
       # check the matched pattern in 4 directions, i.e., up, left, 
       # down, right 
       if (all(data[([i-m, i, i+m, i], [j, j-m, j, j+m])])): 
        pass 
       else: 
        break 
      except: 
       break 
     # If arm length >= 1 
     if m > 1: 
      # When the loop breaks, m is 1 more than the actual arm length 
      # So we need to minus 1 
      # Record the arm length 
      result.append(m-1) 
      # Record the center index 
      center_index.append((i, j)) 
    return(result, center_index) 

# Test data 
l = ['BGBBGB', 'GGGGGG', 'BGBBGB', 'GGGGGG', 'BGBBGB', 'BGBBGB'] 
# The pattern you are matching 
pattern = 'G' 
# Convert the n by m data into an array where each element is a character 
data = np.array([np.array(list(x)) for x in l]) 
result, center_index = findPlusSigh(data, pattern) 
for i, j in zip(result, center_index): 
    print ("Data center (Row {}, Column{}) has a plus sign length of {}".format(
     j[0]+1, j[1]+1, i)) 
관련 문제