簡體   English   中英

有什么方法可以輕松交換字符串中的兩個字符?

[英]Is there any way to swap two characters in a string easily?

例如輸入:

text = 'wish you “happy” every (day)'

預期 output:

text = 'wish you (happy) every “day”'

我想在未知文本中到處用引號交換括號。 我正在做一個學校作業,我不允許使用列表。!! 由於字符串是不可變的,所以我不知道該怎么做。 請幫忙!

這是使用 string.replace() 的愚蠢答案:

text = 'wish you “happy” every (day)'

text = text\
    .replace('”', '*')\
    .replace('“', "^")\
    .replace("(", '“')\
    .replace(")", '”')\
    .replace("*", ')')\
    .replace("^", '(')

這是一個嚴肅的答案:

由於您有一個要替換的字符列表,因此構建一個應該與另一個字符交換的字符的字典,然后遍歷字符串並創建一個新字符串,其中包含帶有替換字母的原始字符串。 這樣,您可以根據需要在 switch 字典中包含盡可能多或盡可能少的字符串,並且無需修改即可工作。 考慮到更大的規模,您可能想要做一些事情,例如將此字典存儲在其他地方,例如,如果您根據從界面或 web 應用程序獲得的用戶輸入創建它。 將您正在做什么和如何做的規范分開通常很好,因為一個可以被視為數據(要交換哪些字符),而另一個是邏輯(實際上是交換它們)。

text = 'wish you “happy” every (day)'

newtext = ''
switch = {
    '“': '(', 
    '”': ')',
    '(': '“', 
    ')': '”',
}

for letter in text:
    if letter in switch: letter = switch[letter]
    newtext += letter

我采用迭代方法的原因是因為我們正在交換字符,所以如果你同時替換每個字符的所有實例,一旦你交換下一個字符,字符就會被交換回來,除非你在*愚蠢的答案或###在另一個答案中,這打開了沖突的可能性(如果您的文本已經包含###*它將被錯誤地替換)。

字符串的不變性是為什么您必須創建newtext字符串而不是在我迭代時替換原始字符串中的字符。

中間替換通常很容易受到攻擊,因為文本可能包含中間表示:Roopak A Nelliat 的答案中的###...### ,Ryan 的“愚蠢”答案中的*^ (編輯:如下面 Ryan 的更嚴肅的文本中所述)。

這是一個不經過中間替換的正則表達式解決方案:

text = 'wish you "happy" every (day)'
def replacer(match):
    quote, content = match.groups()
    if quote:
        return f'({content})'
    else:
        return f'"{content}"'
re.sub(r'(?:(")|\()(.*?)(?(1)"|\))', replacer, text)
# => 'wish you (happy) every "day"'

正則表達式將匹配一個起始分隔符( "( ),然后是內容,以及一個匹配的最終分隔符(即,如果起始分隔符是" then " ,如果不是 then ) )。然后替換器 function 構造與另一個集合的替換的分隔符。

你需要的是正則表達式替換。 此外,該組應保留。

注意:我不得不使用 3 個替換,因為有一個交換。

a = 'wish you "happy" every (day)'
b = re.sub(r'"(\w+)"', r'###\1###', a) 
// replaces words inside double quotes to words inside ###
// b = 'wish you ###happy### every (day)'

c = re.sub(r'\((\w+)\)', r'"\1"', b)
// replaces words inside paranthesis to words inside double quotes
// c = 'wish you ###happy### every "day"'

d = re.sub(r'###(\w+)###', r'(\1)', c)
// replaces the words inside ### to paranthesis
// d = 'wish you (happy) every "day"'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM