假设我有一个字符串,例如:
data = '''Random digits: (1|2|3), (4|5|6), (7|8|9).'''
我怎样才能得到如下输出:
Random digits: 1, 6, 7.
或者
Random digits: 3, 4, 9.
所以这个想法是随机选择每个元素。(||) 可能超过 3 个。谢谢指教!
尝试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|]+)\)'
只接受数字和管道。
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(",") ]
从你的例子中微不足道。更复杂的版本会在 '(' 和 ')' 上拆分,然后在 '|' 上拆分。
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])
像这样的东西:
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)