假设我有一个字符串:
data = '''Random digits: (1|2|3), (4|5|6), (7|8|9).'''
如何获得如下输出:
Random digits: 1, 6, 7.
或
Random digits: 3, 4, 9.
所以我们的想法是随机选择每个元素。 (||)可能超过3。 谢谢你的建议!
答案 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)