1

假设我有一个字符串,例如:

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

我怎样才能得到如下输出:

Random digits: 1, 6, 7.

或者

Random digits: 3, 4, 9.

所以这个想法是随机选择每个元素。(||) 可能超过 3 个。谢谢指教!

4

4 回答 4

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|]+)\)'

只接受数字和管道。

于 2013-05-24T16:19:49.087 回答
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(",") ]
于 2013-05-24T16:38:56.593 回答
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])
于 2013-05-24T16:15:46.977 回答
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)
于 2013-05-24T16:32:04.820 回答