从Python中的字符串打印子字符串的模式

时间:2018-09-25 18:04:26

标签: python string

此问题的输入是字符串,并且具有特定形式。例如,如果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)

谁能告诉我我的代码出了什么问题?

6 个答案:

答案 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)

这是您的方法:

第1步:简单案例,从一个非常简单的模板中获取数据

让我们假设您的模板字符串为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

是的!


第2步:完整案例,带有多个模板

好吧,我们知道如何为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

是的!


步骤3:最后一步,优化

因为我们总是可以做得更好,所以我们不会停止。 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模式,可能需要很长时间才能生成任何匹配项。