字符串中的数字

时间:2013-11-18 18:36:41

标签: python string function numbers

所以我必须编写这个程序,必须基本读取字符串很长的几行。这是我需要检查的字符串示例:

  

让我们说这是第一行,让我们检查第4行   第二行有10号和8号第三行没有任何   数字
这是第四行,我们将在第12行继续这个   是第五行,我们在第8行继续进行第六行   编号6
第七行包含5号,表示第5行   line
这是第八行和最后一行,它在这里结束。
这些   三条线很无聊。他们真的是在第十一行我们   可以看出第12行真的很有趣这是第12行   但我们回到第7行。

我需要一个能读取第一行的函数。它会找到4号。这意味着要检查的nex线将是第4行。在第4行有12号。所以它转到第12行。有7号,所以它转到第7行。有5号,所以第5行,有8号,所以第8行。在第8行,没有更多的数字。 因此,我必须获得没有更多数字的行数。 另外,如果1行中有2个数字,它应该只确认第一个,这应该由我写的另一个函数完成:

def find_number(s):
    s = s.split()
    m = None
    for word in s:
        if word.isdigit():
            m = int(word)
            return word

所以基本上我需要使用这个函数来解决多行的字符串。
所以我的问题是如何通过使用书面函数从一行“跳”到另一行?

3 个答案:

答案 0 :(得分:2)

如果我理解你的问题(我认为我做的很清楚,你说的很清楚),你想在字符串的每一行找到第一个数字,然后转到那一行。

您需要做的第一件事是将字符串拆分为str.splitlines

s = """Let's say this is first line and let's check line 4
In this second line there are number 10 and 8
Third line doesn't have any numbers
This is fourth line and we'll go on in line 12
This is fifth line and we go on in line 8
In sixth line there is number 6
This seventh line contains number 5, which means 5th line
This is eighth and the last line, it ends here.
These three lines are boring.
They really are
In eleventh line we can see that line 12 is really interesting
This is twelfth line but we go back to line 7."""

lines = s.splitlines()

然后你需要获得第一行中的第一个整数。这就是你的功能。

current_line = lines[0]
number = find_number(current_line)

然后你需要做同样的事情,但使用不同的current_line。要获得下一行,您可以这样做:

if number is None:     # No numbers were found
    end_line = current_line
else:
    current_line = lines[first_number]
    number = find_number(current_line)

您希望无限次地重复执行此操作,因此您需要while循环或递归。这听起来像是家庭作业,所以我不会给你这个代码(如果我错了,请纠正我),你必须自己解决。这不应该太难。

供将来参考 - 递归解决方案:

def get_line(line):
    number = find_number(line)
    if number is None:     # No numbers were found
        return line
    else:
        return get_line(find_number(lines[number]))

答案 1 :(得分:1)

  

我需要一个能读取第一行的函数。

如果您使用的是行列表而不是文件,则根本不需要linecache;只有list_of_lines[0]获得第一行。

如果您使用的是单个长字符串,splitlines方法会将其转换为行列表。

如果您使用的是文件,则可以读取整个文件:with open(filename) as f: list_of_lines = list(f)。或者,stdlib有一个函数linecache.getline,它允许您以随机访问顺序从文件中获取行,而无需将整个内容读入内存。

无论你使用哪一个,只要记住Python使用的是基于0的索引,而不是基于1的索引。因此,要阅读第一行,您需要linecache.getline(filename, 0)

我将使用linecache来表明即使是最复杂的问题版本仍然不是很复杂。如果你不需要,你应该能够自己调整它。

  

它会在其中找到第4位。这意味着要检查的nex行将在第4行。

让我们将该逻辑转换为Python。您已经拥有find_number功能,而getline是其他唯一棘手的部分。所以:

line = linecache.getline(filename, linenumber - 1)
linenumber = find_number(line)
if linenumber is None:
    # We're done
else:
    # We got a number.
  

在第4行中有12号。所以它转到第12行。有7号,所以它转到第7行。有5号,所以第5行,有8号,所以第8行。在第8行,没有更多的数字。

所以你需要循环直到linenumber is None。您可以使用while语句执行此操作:

linenumber = 1
while linenumber is not None:
    line = linecache.getline(filename, linenumber - 1)
    linenumber = find_number(line)

唯一的问题是,当linenumber is None时,您希望能够返回指向linenumber的最后一个None。这很简单:

linenumber = 1
while linenumber is not None:
    line = linecache.getline(filename, linenumber - 1)
    new_linenumber = find_number(line)
    if new_linenumber is None:
        return linenumber
    else:
        linenumber = new_linenumber

当然,完成后,您无需重新检查循环顶部的linenumber,因此您只需将其更改为while True:

现在你只需要将它包装在一个函数中,这样就可以将起始值作为参数得到,然后就完成了。


然而,值得注意的是find_number不太有效。当您计算一个数字m时,实际上并不是return m,而是返回其他内容。你需要解决这个问题才能使这一切正常。

答案 2 :(得分:0)

这是我的方法:

def check_line( line = None):
  assert(line != None )
  for word in line.split():
    if word.isdigit():
      return int(word)
  return -1  


next = 0

while next >= 0:
  last = next
  next = check_line(text[next]) -1
  if next >= 0:
    print "next line:", next +1
  else:
    print "The last line with number is:", last +1

它不是世界上效率最高的,但是......