2016-11-15 66 views
1

我很抱歉如果這已被回答以前 - 我不完全知道如何解釋/搜索這個,所以我找不到任何存在的東西。Python - 字符替換的迭代

我正在瀏覽一大串字符串,並試圖在另一個數據集中查找匹配項。輸入數據集以空格分隔,現有數據集使用不一致的下劃線和駝峯組合。

我正在尋找一種乾淨的方式來遍歷這些組合的所有可能性。 最簡單的情況是這樣的:

輸入:「變型」

所需的輸出:「Variant_Type」,「不定型別」

我一直在通過搜索兩次完成這2個字的情況:

x = input.replace(' ','_') 
# Search 
x = x.replace('_','') 
# Search again 

但現在,我意識到有很多像長字符串:

輸入:「時間軸集成啓用」

所需的輸出:

「Timeline_Integration_Enabled」, 「TimelineIntegration_Enabled」, 「Timeline_IntegrationEnabled」, 「TimelineIntegrationEnabled」

有一個聰明的,Python化的方式來做到這一點?

注意:我知道我可以使用類似difflib.get_close_matches()的東西,但是我希望將它作爲數據的最後一遍,提示用戶在任何不清楚的字段上做出決定。

在此先感謝,並讓我知道你是否需要任何更多細節。

+0

這是您實現它的最好也是最簡單的方法。 – Inconnu

+0

如果用戶輸入「啓用時間軸集成」,怎麼可能?將它改爲大寫的第一個字母,然後追加或像「Timeline_integration_enabled」? – bzimor

回答

3
def iterate_replacements(input_data): 
    if " " in input_data: 
     yield from iterate_replacements(input_data.replace(" ", "", 1)) 
     yield from iterate_replacements(input_data.replace(" ", "_", 1)) 
    else: 
     yield input_data 

for s in iterate_replacements("Timeline Integration Enabled"): 
    print(s) 

或者2.7,不支持yield from

def iterate_replacements(input_data): 
    if " " in input_data: 
     for x in iterate_replacements(input_data.replace(" ", "", 1)): yield x 
     for x in iterate_replacements(input_data.replace(" ", "_", 1)): yield x 
    else: 
     yield input_data 

for s in iterate_replacements("Timeline Integration Enabled"): 
    print(s) 

結果:

TimelineIntegrationEnabled 
TimelineIntegration_Enabled 
Timeline_IntegrationEnabled 
Timeline_Integration_Enabled 
0

這是另一種可以將字符串連接在一起的方法,雖然你做的方式很簡單。使用Django的slugify。

from django.template.defaultfilters import slugify 
print(slugify("Variant Type")) 
0

所以,如果我理解正確的話,你只是想刪除下劃線和空間。

如果你得到了Timeline_Integration的匹配,你也會得到TimelineIntegration的匹配,所以我有點困惑,爲什麼你想要用'_'或''來替換空格。

例如:搜索「時間軸集成方法」:

搜索「Timeline_Integration」:

爲什麼不直接替換_中的搜索以及搜索到的文本輸入的字符串。這保持一致性。或者,如果您想區分大小寫,請將'_'替換爲''。

除非我完全誤解了目標,我相信一個可能的解決方案是隻完全去除第一搜索和做這樣的事情:

解決方案:

空間不敏感

SEARCH_STRING = ''.join([x for search_string,if x!=''and x!='_']) to_be_searched_string =''.join([x for_be_searched_string if x!=''and x!= '_'])

s對步調敏感

search_string =''.join([x for search_string中的x如果x!=''else'_']) to_be_searched_string =''.join([x for_be_searched_string if x!=' 'else'_'])