此问题的输入是字符串,并且具有特定形式。例如,如果s是字符串,则输入可以为s='3(a)2(b)' or s='3(aa)2(bbb)' or s='4(aaaa)'
。输出应为字符串,即括号内的子字符串乘以括号内的子字符串的数值子字符串值。
例如,
Input ='3(a)2(b)'
Output='aaabb'
Input='4(aaa)'
Output='aaaaaaaaaaaa'
,其他输入也类似。该程序应为错误或无效的输入打印一个空字符串。
这是我到目前为止尝试过的
s='3(aa)2(b)'
p=''
q=''
for i in range(0,len(s)):
#print(s[i],end='')
if s[i]=='(':
k=int(s[i-1])
while(s[i+1]!=')'):
p+=(s[i+1])
i+=1
if s[i]==')':
q+=k*p
print(q)
谁能告诉我我的代码出了什么问题?
答案 0 :(得分:0)
一个班轮是:
class Something {
method() {}
another() {}
}
const instance = default(new Something(), "method");
instance(); // calls Something.prototype.method
instance.another(); // everything else should still exist
它像这样工作。我们接受输入,并在封闭括号内进行分割
''.join(int(y[0])*y[1] for y in (x.split('(') for x in Input.split(')')[:-1]))
这为我们提供了要查找的整数字符对,但是我们需要摆脱开放式括号,因此对于In [1]: Input ='3(a)2(b)'
In [2]: a = Input.split(')')[:-1]
In [3]: a
Out[3]: ['3(a', '2(b']
中的每个x
,我们将开放式括号拆分为得到一个由两个元素组成的列表,其中第一个元素是int(仍为字符串)和字符。您会在a
b
因此,对于In [4]: b = [x.split('(') for x in a]
In [5]: b
Out[5]: [['3', 'a'], ['2', 'b']]
中的每个元素,我们都需要将第一个元素转换为b
的整数并乘以字符。
int()
现在,我们加入空字符串以使用
将它们组合成一个字符串In [6]: c = [int(y[0])*y[1] for y in b]
In [7]: c
Out[7]: ['aaa', 'bb']
答案 1 :(得分:0)
尝试一下:
a = re.findall(r'[\d]+', s)
b = re.findall(r'[a-zA-Z]+', s)
c = ''
for i, j in zip(a, b):
c+=(int(i)*str(j))
print(c)
答案 2 :(得分:0)
这是您的方法:
让我们假设您的模板字符串为3(a)
。这是我能想到的最简单的情况。我们需要从该字符串中提取信息。第一个是必须渲染的字符数。第二个是必须呈现的字符。
您遇到的情况是正则表达式不适合使用(因此,使用python标准库中的re
模块)。
我不会对正则表达式进行完整的课程。您必须自己做。但是,我将快速解释我使用的步骤。因此,count
(保存我们应渲染char的次数的变量)是一个数字(或多个)。因此,我们的第一个捕获组将类似于(\d+)
。然后,我们要提取一个用括号括起来的字符,因此为\((\w+)\)
(实际上我一次启用了几个字符)。因此,如果将它们放在一起,我们将得到(\d+)\((\w+)\)
。要进行测试,您可以签出this。
在我们的案例中,re
模块的直接用法是:
import re
# Our template
template = '3(a)'
# Run the regex
match = re.search(r'(\d+)\((\w+)\)', template)
if match:
# Get the count from the first capturing group
count = int(match.group(1))
# Get the string to render from the second capturing group
string = match.group(2)
# Print as many times the string as count was given
print count * string
输出:
aaa
是的!
好吧,我们知道如何为1个模板执行此操作,如何为多个模板(例如3(a)4(b)
)执行相同操作?好吧...我们将如何“手工完成 ”?我们从左到右阅读了完整的模板,然后逐一应用每个模板。这就是我们将要用python做的事情!
对我们来说,re
模块希望为此提供一个功能:finditer
。它完全符合我们上面的描述。
因此,我们将执行以下操作:
import re
# Our template
template = '3(a)4(b)'
# Iterate through found templates
for match in re.finditer(r'(\d+)\((\w+)\)', template):
# Get the count from the first capturing group
count = int(match.group(1))
# Get the string to render from the second capturing group
string = match.group(2)
print count * string
输出:
aaa
bbbb
好吧……只是这些东西的组合而已。我们知道我们可以将所有内容放入数组中的每个步骤,然后在最后加入该数组的每个项目,不是吗?
开始吧!
import re
template = '3(a)4(b)'
parts = []
for match in re.finditer(r'(\d+)\((\w+)\)', template):
parts.append(int(match.group(1)) * match.group(2))
print ''.join(parts)
输出:
aaabbb
是的!
因为我们总是可以做得更好,所以我们不会停止。 for
循环很酷。但是我喜欢python(这是个人的)是因为实际上有很多东西可以用一行编写!这里是这样吗?好吧:)。
首先,我们可以使用列表推导删除for
循环和append
:
parts = [int(match.group(1)) * match.group(2) for match in re.finditer(r'(\d+)\((\w+)\)', template)]
rendered = ''.join(parts)
最后,让我们先删除两行,先填充parts
,然后再删除join
,然后在一行中完成所有操作:
import re
template = '3(a)4(b)'
rendered = ''.join(
int(match.group(1)) * match.group(2) \
for match in re.finditer(r'(\d+)\((\w+)\)', template))
print rendered
输出:
aaabbb
是的!还是一样的输出:)。
希望它有所帮助!
答案 3 :(得分:0)
每次迭代后应刷新“ p”的值。
s='1(aaa)2(bb)'
p=''
q=''
i=0
while i<len(s):
if s[i]=='(':
k=int(s[i-1])
p=''
while(s[i+1]!=')'):
p+=(s[i+1])
i+=1
if s[i]==')':
q+=k*p
i+=1
print(q)
答案 4 :(得分:0)
代码没有按照我希望的方式运行。这里的问题是'p'的位置。 'p'是在()s内添加子字符串的变量。即使重复了足够的操作,我仍在重复该过程。将'p'放在'if'块内即可完成工作。
s='2(aa)2(bb)'
q=''
for i in range(0,len(s)):
if s[i]=='(':
k=int(s[i-1])
p=''
while(s[i+1]!=')'):
#print(i,'first time')
p+=s[i+1]
i+=1
q+=p*k
#print(i,'second time')
print(q)
答案 5 :(得分:-3)
您想要的不是打印子字符串。真正的目的是最喜欢生成基于文本的正则表达式或命令。 您可以参数化一个函数以读取它或使用类似它的东西:
python库rstr具有功能xeger()
,它通过使用随机字符串并仅返回匹配的字符串来完成所需的操作:
示例
Install with pip install rstr
In [1]: from __future__ import print_function
In [2]: import rstr
In [3]: for dummy in range(10):
...: print(rstr.xeger(r"(a|b)[cd]{2}\1"))
...:
acca
bddb
adda
bdcb
bccb
bcdb
adca
bccb
bccb
acda
警告 对于复杂的re模式,可能需要很长时间才能生成任何匹配项。