从字符串中随机选择

时间:2013-05-24 16:10:08

标签: python string templates random choice

假设我有一个字符串:

data = '''Random digits: (1|2|3), (4|5|6), (7|8|9).'''

如何获得如下输出:

Random digits: 1, 6, 7.

Random digits: 3, 4, 9.

所以我们的想法是随机选择每个元素。 (||)可能超过3。 谢谢你的建议!

4 个答案:

答案 0 :(得分:2)

尝试使用替换功能re.sub

import re, random

def rand_replace(m):
    return random.choice(m.group(1).split('|'))

data = '''Random digits: (1|2|3), (4|5|6), (7|8|9).'''    
print re.sub(r'\((.+?)\)', rand_replace, data)

这也适用于非数字字符串,例如“(nice | good)(day | night)”。如果你想具体,这个正则表达式:

r'\(([\d|]+)\)'

只接受数字和管道。

答案 1 :(得分:1)

from random import choice
import re

test = '''Random digits: (1|2|3), (4|5|6), (7|8|9).'''

def get_rc(data):
    tokens = data.split(",")
    chosen = list()
    for part in tokens: chosen.append(choice(re.findall("[0-9]+",part)))

尝试一下:

>>> get_rc(test)
['2', '5', '9']
>>> get_rc(test)
['1', '4', '7']
>>> get_rc(test)
['1', '6', '7']
>>> get_rc(test)
['3', '5', '8']
>>> get_rc(test)
['1', '6', '9']
>>> get_rc(test)
['1', '4', '8']
>>> get_rc(test)
['2', '4', '9']

大多数Pythonian:

def get_rc2(data):
    return [ choice(re.findall("[0-9]+",i)) for i in data.split(",") ]

如果要将整数返回而不是数字作为字符串:

def get_rc2(data):
    return [ int(choice(re.findall("[0-9]+",i))) for i in data.split(",") ]

答案 2 :(得分:0)

从你的例子中简单地说。更复杂的版本将分为'('和')',然后分为'|'。

from random import choice
data = '''Random digits: (1|2|3), (4|5|6), (7|8|9).'''
print "Random digits: " + choice(data[16:21:2]) + ", " + choice(data[25:30:2]) + ", " + choice(data[34:39:2])

答案 3 :(得分:0)

这样的事情:

import re
import random

data = '''Random digits: (1|2|3), (4|5|6), (7|8|9).'''

random_digits = list()
for group in (m.strip('()').split('|') for m in re.findall(r'\([\d\|]+\)', data)):
    random_digits.append(random.choice(group))

print 'Random digits: ' + ', '.join(random_digits)