2013-11-04 118 views
0

說我有串替換字符串中的子串的隨機實例

s = 'x x x x x' 

我想隨意改變的「X」到y的一個

s2 = 'x x y x x' 

x和y會多個字符長。

如果我只是想改變x的第一個實例,我會使用string.replace,但我怎樣才能改變一個隨機的實例?

+0

這是僅適用於具有由空格分隔一個字符類型的序列串的情況? –

+0

令牌('xx','yy',...)總是由一個空格分隔嗎? –

+0

它們不是完全分離的,它可以是任意的字符,例如句子,其中x和y是多個單詞。 – user2953349

回答

4

你可以使用re.finditer檢索所有可能的匹配的開始/結束,做一個合適的替代品。這將涵蓋可變長度替換,但意味着您需要警惕frm參數的重新語法。

import re 
from random import choice 

def replace_random(src, frm, to): 
    matches = list(re.finditer(frm, src)) 
    replace = choice(matches) 
    return src[:replace.start()] + to + src[replace.end():] 

實施例:

>>> [replace_random('x x x x x', r'\bx\b', 'y') for _ in range(10)] 
['y x x x x', 'x x x x y', 'x x y x x', 'x y x x x', 'x x x y x', 'x x x y x', 'x x y x x', 'x y x x x', 'x x x x y', 'x x y x x'] 
+2

如果你希望它像'str.replace'一樣行事,你總是可以're.escape''frm'。 – mgilson

+0

@mgilson Yep ...對於生產目的來說,它可能應該被記錄,預計會提供一個實際的正則表達式模式...除非OP更喜歡添加另一個選項,使函數能夠在兩種模式下運行......但這可能只是令人困惑...... –

+1

我想如果你使用'needle','haystack'和'replacement'作爲變量名稱,它也可以讓這個例子更加清晰 - 但也許這只是我個人的偏好。 –

2

你可以做

import random 

def replace_random(string, str_a, str_b): 
    rand = max(random.randint(0, string.count(str_a)), 1) 
    return string.replace(str_a, str_b, rand).replace(str_b, str_a, rand - 1) 

print replace_random('x x x x x', 'x', 'y') 
相關問題