2017-08-03 9 views
0

に1試合をフィードIきた部分が辞書に発見された場合、文字列の一部を超えると繰り返し処理は、キーに置き換え機能:一方パイソン - 正規表現 - 他

def normalize(street): 
      acronyms = {'AVE':'AVENUE', 'RD': 'ROAD', 'BLVD': 'BOULEVARD', 
      'PKWY': 'PARKWAY','HWY':'HIGHWAY', 'ST': 'STREET', 
      'E': 'EAST','W':'WEST','S': 'SOUTH','N': 'NORTH'} 
      return [re.sub(r"\b%s\b" %street_part, acronyms[street_part], 
      street) for street_part in street.split() if street_part in 
      acronyms] 

normalize('123 E MAIN AVE') 
['123 EAST MAIN AVE', '123 E MAIN AVENUE'] 

出力はする必要があります: [「123 EAST MAIN AVENUE」]

をどのように私はさらなる拡大のために戻って理解に各戻り値を養うことができますか?または、解読の反復を繰り返して、最終的な展開された住所を取得しますか?手伝ってください。

答えて

1

ここで複雑な正規表現パターンがない限り、私は発電機の理解の中でdictにインデックスを付けることをお勧めします。

In [1051]: acronyms = ... 

In [1052]: text = '123 E MAIN AVE' 

In [1055]: ' '.join(acronyms.get(x, x) for x in text.split()) 
Out[1055]: '123 EAST MAIN AVENUE' 

acronyms.get(x, x)バックが存在する場合、交換を返すか、単に再エコー元の文字列。

+0

うわーは魅力のように働きました。ありがとう。 – skrubber

+0

@Mokshyam喜んで助けて! –

0
としてあなたの関数を変更し

def normalize(street): 
     acronyms = {'AVE':'AVENUE', 'RD': 'ROAD', 'BLVD': 'BOULEVARD',\ 
        'PKWY': 'PARKWAY','HWY':'HIGHWAY', 'ST': 'STREET',\ 
     'E': 'EAST','W':'WEST','S': 'SOUTH','N': 'NORTH'} 
     for street_part in street.split(): 
      if street_part in acronyms: 
       street = re.sub(r"\b%s\b" %street_part, acronyms[street_part], street) 
     return street