Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
打印子字符串';Python中字符串的模式_Python_String - Fatal编程技术网

打印子字符串';Python中字符串的模式

打印子字符串';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是字符串,则输入可以是
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)'