web-dev-qa-db-ja.com

Pythonの辞書値を使用してstr.replace()を記述できますか?

北、南などを住所フィールドのN Sに置き換える必要があります。

私が持っている場合

list = {'NORTH':'N','SOUTH':'S','EAST':'E','WEST':'W'}
address = "123 north anywhere street"

辞書の値を反復処理して住所フィールドを置き換えることはできますか?

for dir in list[]:
   address.upper().replace(key,value)

私も近くにいないよ!ただし、このような辞書値を使用できる場合は、どんな入力でも歓迎します。

23
user1947457
address = "123 north anywhere street"

for Word, initial in {"NORTH":"N", "SOUTH":"S" }.items():
    address = address.replace(Word.lower(), initial)
print address

素晴らしく簡潔で読みやすい。

15
rikAtee

あなたは実際に近いです:

_dictionary = {"NORTH":"N", "SOUTH":"S" } 
for key in dictionary.iterkeys():
    address.upper().replace(key, dictionary[key])
_

注: for Python 3ユーザーの場合、.keys()の代わりに.iterkeys()を使用する必要があります。

_dictionary = {"NORTH":"N", "SOUTH":"S" } 
for key in dictionary.keys():
    address.upper().replace(key, dictionary[key])
_
5

おそらくiteritems()を探しています:

d = {'NORTH':'N','SOUTH':'S','EAST':'E','WEST':'W'}
address = "123 north anywhere street"

for k,v in d.iteritems():
    address = address.upper().replace(k, v)

アドレスは'123 N ANYWHERE STREET'


大文字と小文字、空白、ネストされた単語(たとえば、SouthstreetSstreetに変換すべきではない)を保持する場合は、次の単純なリスト内包表記の使用を検討してください。

import re

l = {'NORTH':'N','SOUTH':'S','EAST':'E','WEST':'W'}

address = "North 123 East Anywhere Southstreet    West"

new_address = ''.join(l[p.upper()] if p.upper() in l else p for p in re.split(r'(\W+)', address))

new_addressは現在

N 123 E Anywhere Southstreet    W
3
sloth

誰もまだ提案していないと思う1つのオプションは、すべてのキーを含む正規表現を作成してから、文字列を1回置き換えるだけです:

>>> import re
>>> l = {'NORTH':'N','SOUTH':'S','EAST':'E','WEST':'W'}
>>> pattern = '|'.join(sorted(re.escape(k) for k in l))
>>> address = "123 north anywhere street"
>>> re.sub(pattern, lambda m: l.get(m.group(0).upper()), address, flags=re.IGNORECASE)
'123 N anywhere street'
>>> 

これには、正規表現が変更せずに入力文字列の大文字小文字を無視できるという利点があります。

完全な単語のみを操作したい場合は、パターンを単純に変更するだけで同様に操作できます。

>>> pattern = r'\b({})\b'.format('|'.join(sorted(re.escape(k) for k in l)))
>>> address2 = "123 north anywhere southstreet"
>>> re.sub(pattern, lambda m: l.get(m.group(0).upper()), address2, flags=re.IGNORECASE)
'123 N anywhere southstreet'
3
Duncan

文字列を辞書で「翻訳」することは非常に一般的な要件です。ツールキットに保持したい機能を提案します。

def translate(text, conversion_dict, before=None):
    """
    Translate words from a text using a conversion dictionary

    Arguments:
        text: the text to be translated
        conversion_dict: the conversion dictionary
        before: a function to transform the input
        (by default it will to a lowercase)
    """
    # if empty:
    if not text: return text
    # preliminary transformation:
    before = before or str.lower
    t = before(text)
    for key, value in conversion_dict.items():
        t = t.replace(key, value)
    return t

その後、あなたは書くことができます:

>>> a = {'hello':'bonjour', 'world':'tout-le-monde'}
>>> translate('hello world', a)
'bonjour tout-le-monde'
3
fralau
def replace_values_in_string(text, args_dict):
    for key in args_dict.keys():
        text = text.replace(key, str(args_dict[key]))
    return text
2
Artem Malikov

試して、

import re
l = {'NORTH':'N','SOUTH':'S','EAST':'E','WEST':'W'}

address = "123 north anywhere street"

for k, v in l.iteritems():
    t = re.compile(re.escape(k), re.IGNORECASE)
    address = t.sub(v, address)
print(address)
1
Adem Öztaş

単純な置換の代わりに正規表現を使用することをお勧めします。置換を使用すると、単語のサブパートが置換されるリスクがありますが、これはおそらくあなたが望むものではありません。

import json
import re

with open('filePath.txt') as f:
   data = f.read()

with open('filePath.json') as f:
   glossar = json.load(f)

for Word, initial in glossar.items():
   data = re.sub(r'\b' + Word + r'\b', initial, data)

print(data)
1
Trafalgar

これらの答えはすべて良いですが、あなたはpython文字列の置換がありません-それは簡単で迅速ですが、文字列を正しくフォーマットする必要があります。

address = "123 %(direction)s anywhere street"
print(address % {"direction": "N"})
1
Anna

replace()format()の使用はどちらもそれほど正確ではありません。

_data =  '{content} {address}'
for k,v in {"{content}":"some {address}", "{address}":"New York" }.items():
    data = data.replace(k,v)
# results: some New York New York

'{ {content} {address}'.format(**{'content':'str1', 'address':'str2'})
# results: ValueError: unexpected '{' in field name
_

正確な場所が必要な場合は、re.sub()で翻訳することをお勧めします。

_import re
def translate(text, kw, ignore_case=False):
    search_keys = map(lambda x:re.escape(x), kw.keys())
    if ignore_case:
        kw = {k.lower():kw[k] for k in kw}
        regex = re.compile('|'.join(search_keys), re.IGNORECASE)
        res = regex.sub( lambda m:kw[m.group().lower()], text)
    else:
        regex = re.compile('|'.join(search_keys))
        res = regex.sub( lambda m:kw[m.group()], text)

    return res

#'score: 99.5% name:%(name)s' %{'name':'foo'}
res = translate( 'score: 99.5% name:{name}', {'{name}':'foo'})
print(res)

res = translate( 'score: 99.5% name:{NAME}', {'{name}':'foo'}, ignore_case=True)
print(res)
_
0
ahuigo