打印子字符串';Python中字符串的模式
这个问题的输入是一个字符串,具有特定的形式。例如,如果s是字符串,则输入可以是打印子字符串';Python中字符串的模式,python,string,Python,String,这个问题的输入是一个字符串,具有特定的形式。例如,如果s是字符串,则输入可以是s='3(a)2(b)'或s='3(aa)2(bbb)'或s='4(aaaa)。输出应该是一个字符串,即括号内的子字符串乘以括号内的子字符串后面的数字子字符串值。 比如说, Input ='3(a)2(b)' Output='aaabb' Input='4(aaa)' Output='aaaaaaaaaaaa' 对于其他输入也是如此。程序应打印错误或无效输入的空字符串 这就是我到目前为止所尝试的 s='3(aa)2
s='3(a)2(b)'或s='3(aa)2(bbb)'或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)
有人能说出我的代码有什么问题吗?一行代码应该是:
''.join(int(y[0])*y[1] for y in (x.split('(') for x in Input.split(')')[:-1]))
它是这样工作的。我们接受输入,然后在闭合的paren上拆分
In [1]: Input ='3(a)2(b)'
In [2]: a = Input.split(')')[:-1]
In [3]: a
Out[3]: ['3(a', '2(b']
这就给出了我们正在寻找的整数和字符对,但我们需要去掉开放参数,因此对于a
中的每个x
,我们在开放参数上进行拆分,得到一个两元素列表,其中第一个元素是int(仍然是字符串)和字符。您将在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']
现在我们加入空字符串,将它们组合成一个字符串
In [8]: ''.join(c)
Out[8]: 'aaabb'
您需要的不是打印子字符串。真正的目的是生成基于文本的正则表达式或命令。 您可以将函数参数化以读取它或使用类似的内容: 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
警告
对于复杂的重模式,这可能需要很长时间才能生成任何匹配项。请尝试以下操作:
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)
以下是您如何做到这一点: 步骤1:简单案例,从非常简单的模板中获取数据 假设模板字符串是
3(a)
。这是我能想到的最简单的例子。我们需要从该字符串中提取信息片段。第一个是必须渲染的字符数。第二个是必须呈现的字符
在这种情况下,正则表达式非常适合(因此,使用python标准库中的模块)
我不会上一整门关于正则表达式的课。你得靠我们自己去做。不过,我会很快解释我使用的步骤。因此,count
(保存我们应该呈现字符的次数的变量)是一个数字(或几个)。因此,我们的第一个捕获组类似于(\d+)
。然后我们有一个用括号括起来的要提取的字符,因此\(\w+)
(实际上我可以一次呈现多个字符)。所以,如果我们把它们放在一起,我们会得到(\d+)\(\w+)
。对于测试,您可以查看
应用到我们的案例中,该模块的直接用途是:
重新导入
#我们的模板
模板='3(a)'
#运行正则表达式
匹配=重新搜索(r'(\d+)\(\w+)\,模板)
如果匹配:
#从第一个捕获组获取计数
计数=整数(匹配组(1))
#从第二个捕获组获取要渲染的字符串
string=match.group(2)
#按给定的计数打印字符串的次数
打印计数*字符串
输出:
aaa
aaa
bbbb
aaabbb
aaabbb
是啊
步骤2:完整案例,包含多个模板 好的,我们知道如何对一个模板执行此操作,如何对多个模板执行相同操作,例如
3(a)4(b)
?好。。。我们如何“用手”完成它?我们将从左到右阅读完整的模板,并逐个应用每个模板。那么这就是我们要用python做的事情
希望对我们来说,该模块有一个功能就是这样:finditer
。它正是我们上面描述的
因此,我们将做如下操作:
输出:
aaa
aaa
bbbb
aaabbb
aaabbb
好的。。。只是这些东西的组合。我们知道我们可以把每一步的所有东西都放在一个数组中,然后在最后加入这个数组的每个项目,不是吗
让我们做吧
重新导入
模板='3(a)4(b)'
部分=[]
对于re.finditer(r'(\d+)\(\w+)\)模板中的匹配:
parts.append(int(match.group(1))*match.group(2))
打印“”连接(部件)
输出:
aaa
aaa
bbbb
aaabbb
aaabbb
是啊
步骤3:最后一步,优化 因为我们总是可以做得更好,我们不会停止<代码>for循环很酷。但是我喜欢python(这是我个人的爱好)的地方是,有太多的东西你实际上可以只用一行就写出来!这里是这样吗?嗯,是的 首先,我们可以使用列表删除
for
循环和append
:
parts=[int(match.group(1))*match.group(2)用于在re.finditer(r'(\d+)\(\w+)\)模板中进行匹配]
呈现=“”。连接(部分)
最后,让我们用parts
填充删除两行,然后join
在一行中完成所有操作:
重新导入
模板='3(a)4(b)'
呈现=“”。连接(
int(match.group(1))*match.group(2)\
对于re.finditer中的匹配(r'(\d+)\(\w+)\,模板))
打印渲染
输出:
aaa
aaa
bbbb
aaabbb
aaabbb
是啊!仍然是相同的输出:)
希望有帮助 每次迭代后都应刷新“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)
s='1(aaa)2(bb)'
p=''
q=''
i=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)
到目前为止你试过什么?同样,对于所有投票反对这个问题的人,请解释原因。这是家庭作业吗?请说明到目前为止你已经尝试了什么,以及你到底在哪里遇到了麻烦。复制粘贴答案并不能帮助您理解它是如何解决的。我在练习字符串问题时看到了这个问题。这不是家庭作业。即使不是家庭作业,你也应该做一个公平的尝试。这如何帮助任何人变成'3(a)2(b)'