說我有串替換字符串中的子串的隨機實例
s = 'x x x x x'
我想隨意改變的「X」到y的一個
s2 = 'x x y x x'
x和y會多個字符長。
如果我只是想改變x的第一個實例,我會使用string.replace,但我怎樣才能改變一個隨機的實例?
說我有串替換字符串中的子串的隨機實例
s = 'x x x x x'
我想隨意改變的「X」到y的一個
s2 = 'x x y x x'
x和y會多個字符長。
如果我只是想改變x的第一個實例,我會使用string.replace,但我怎樣才能改變一個隨機的實例?
你可以使用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']
如果你希望它像'str.replace'一樣行事,你總是可以're.escape''frm'。 – mgilson
@mgilson Yep ...對於生產目的來說,它可能應該被記錄,預計會提供一個實際的正則表達式模式...除非OP更喜歡添加另一個選項,使函數能夠在兩種模式下運行......但這可能只是令人困惑...... –
我想如果你使用'needle','haystack'和'replacement'作爲變量名稱,它也可以讓這個例子更加清晰 - 但也許這只是我個人的偏好。 –
你可以做
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')
這是僅適用於具有由空格分隔一個字符類型的序列串的情況? –
令牌('xx','yy',...)總是由一個空格分隔嗎? –
它們不是完全分離的,它可以是任意的字符,例如句子,其中x和y是多個單詞。 – user2953349