通过字符串迭代模式?

时间:2013-02-28 05:31:04

标签: python string loops

我正在做一个python练习问题,我必须区分模式。例如,一个模式是我必须计算被几个x包围的“oo”。

line = "xooxxxxooxxxxoxoxxxxoxoxxxxxxxoxoxxoooxxxxxxxxxxxx"

被x包围的“oo”只是其他几种模式中的一种。我尝试使用for循环,但令人尴尬的是没有工作。有没有办法我可以通过字符串来获取某些模式以添加到计数变量?如果我学会了如何为这个做,我相信我可以找到这种做法的其他模式。 :) 谢谢!

我试过

for "oo" in line:
    count += 1

但它不起作用。对于循环真的很糟糕,对不起。 预期输出是此模式的计数:2 o被x的

包围

4 个答案:

答案 0 :(得分:1)

首先,你有一个文字("oo"),你需要一个变量才能让你的循环工作:

for "oo" in line:
#   ^literal not allowed here

为了使用循环执行类似的操作,您可能希望遍历 indices ,检查字符串的一部分并查看它是否与特定子字符串匹配:

count = 0
for i in range(len(line)):
    if line[i:i+4] == 'xoox':
       count += 1

请注意,这样做绝对不是“pythonic”。一个pythonic解决方案将是:

line.count('xoox')  #  Batteries included :-)

答案 1 :(得分:0)

您的代码应该像SyntaxError一样提供can't assign to literal。你期望循环遍历字符串中的所有'oo's,但是这不是发生的事情,或者应该发生什么。

你可能想到的是循环遍历字符串并查看有多少'oo',在这种情况下无法完成。

有一个很棒的内置函数叫count(),它有...计数。你如何使用它是:

yourstring.count(str) # str here is what you want to count, 
                      # yourstring is where you are counting

它返回一个整数,所以这是你想要的代码:

>>> line = "xooxxxxooxxxxoxoxxxxoxoxxxxxxxoxoxxoooxxxxxxxxxxxx"
>>> line.count('oo')
3

答案 2 :(得分:0)

如果没有给出答案,split函数可能会对您有用...... http://docs.python.org/2/howto/regex.html#splitting-strings

test = "xxxxooxxxxoooxxxx"
test.split("oo")

该代码返回['xxxx', 'xxxx', 'oxxxx']

希望有所帮助。换句话说,如果你有以'x'结尾的连续字符串,而另一个字符串以'x'开头,你就会计算出事件。

答案 3 :(得分:0)

三种解决方案,以满足您的需求:

  

我尝试使用for循环,但令人尴尬的是没有工作。是   有一种方法,我可以通过一个字符串来获取某些模式   添加到计数变量?如果我学会了如何为这个做,我就是   我确定可以找到这种做法的其他模式。

解决方案1 ​​

line = "Bxooxxx xoox  xxoxoxxxoxoxxxox#xoooxxoox"
print line,'\n'

def explore(X):
    it = iter(X)
    prec = it.next()
    print 'prec  ch1  next  next'
    for ch in it:
        print ' %r  %r' % (prec,ch),
        if (prec,ch)==('x','o'):
            prec = it.next()
            print ' %r' % prec,
            if prec=='o':
                prec = it.next()
                if prec =='x':
                    print '  %r    OK !!' % prec
                    yield 1
                else:
                    print '  %r   not good' % prec
            else:
                print '  stop'
        else:
            print
            prec = ch
print sum(explore(line))

结果

Bxooxxx xoox  xxoxoxxxoxoxxxox#xoooxxoox 

prec  ch1  next  next
 'B'  'x'
 'x'  'o'  'o'   'x'    OK !!
 'x'  'x'
 'x'  'x'
 'x'  ' '
 ' '  'x'
 'x'  'o'  'o'   'x'    OK !!
 'x'  ' '
 ' '  ' '
 ' '  'x'
 'x'  'x'
 'x'  'o'  'x'   stop
 'x'  'o'  'x'   stop
 'x'  'x'
 'x'  'x'
 'x'  'o'  'x'   stop
 'x'  'o'  'x'   stop
 'x'  'x'
 'x'  'x'
 'x'  'o'  'x'   stop
 'x'  '#'
 '#'  'x'
 'x'  'o'  'o'   'o'   not good
 'o'  'x'
 'x'  'x'
 'x'  'o'  'o'   'x'    OK !!
3

解决方案2

line = "Bxooxxx xoox  xxoxoxxxoxoxxxox#xoooxxoox"
print line,'\n'

def expl(X):
    it4 = iter(X)
    it4.next();it4.next();it4.next()
    it3 = iter(X)
    it3.next();it3.next()
    it2 = iter(X)
    it2.next()
    it1 = iter(X)
    for a in it4:
        if (it1.next(),it2.next(),it3.next(),a)==('x','o','o','x'):
            yield 1

print sum(expl(line))

结果

Bxooxxx xoox  xxoxoxxxoxoxxxox#xoooxxoox 

3

解决方案3

line = "Bxooxxx xoox  xxoxoxxxoxoxxxox#xoooxxoox"
print line,'\n'

import re
reg = re.compile('(?<=x)oox')
print len(reg.findall(line))

结果

Bxooxxx xoox  xxoxoxxxoxoxxxox#xoooxxoox 

3

因此,请考虑迭代器和生成器