【问题标题】:Finding Continuing Numbers in Python在 Python 中查找连续数字
【发布时间】:2017-05-23 23:29:54
【问题描述】:

首先,我为我模糊的问题框架道歉,我只是不知道该怎么称呼这个问题。我也搜索了很多谷歌试图找到解决方案,但我没有得出任何结论。

我目前有一整串数字,如@9​​87654321@。我想遍历字符串,一旦遇到左大括号,我想在遇到右大括号之前取出所有数字并将它们放入变量中。我已经想到了一种方法,如下所示:

string = '15-5.{123434}.15-18.'
result = ""

for index, letter in enumerate(string):  # For every letter with it's index,
    if letter == '{':  # If letter is '{',
        for number in string[index:]:  # Start a loop from that index,
            if number =='}':  # If number becomes '}',
                break
            result += number  #Else append the number in the result string.

但是,我想知道是否有更好的方法来做到这一点。我感谢所有的答案。谢谢!

系统:Windows 10、32 位 Python版本:3.6.0

【问题讨论】:

  • 使用正则表达式?
  • 你对正则表达式很熟悉吗?他们使这个问题变得微不足道。
  • 我正在考虑使用正则表达式,但我不太了解它们,也不知道是否应该使用 re.search()、re.match() 或任何其他合适的选项。
  • 同一行可以有多个花括号吗?
  • 使用 re.finditer() 或 re.findall()。

标签: python string for-loop numbers


【解决方案1】:

这是我推荐正则表达式的少数几次之一:

In [27]: for i in re.findall("\{\d+\}", '15-5.{123434}.15-18.'): print(i[1:-1])
123434

当然,你可以自己写一个函数来解析它:

def getNums(s):
    answer = []
    curr = []
    acc = False
    for char in s:
        if char == "{":
            acc = True
            continue
        if char == "}":
            acc = False
            answer.append(''.join(curr))
            acc = False
            continue
        if acc:
            curr.append(char)

【讨论】:

  • 哦!我以为我可以用正则表达式解决它,但不知道该使用哪一个,非常感谢!但我不明白你为什么使用Inthingy
  • @Frixoe:In 只是我的 python 终端。别担心 :)
  • @Frixoe 你可以忽略它。这只是其中一个 python 终端的提示
  • 哦,好的!非常感谢!
【解决方案2】:

没有敲正则表达式,但我想我找到了另一个带有 .split() 的单行

[e.split('}')[0] for e in s.split('{') if '}' in e]  

测试:

ss = ['','{}','{0}','1','{0}1','1{0}','{0}{2}','{0}1{2}','{0}1{2}3']                      

for s in ss:                       
    print(s,[e.split('}')[0] for e in s.split('{') if '}' in e])
 []
{} ['']
{0} ['0']
1 []
{0}1 ['0']
1{0} ['0']
{0}{2} ['0', '2']
{0}1{2} ['0', '2']
{0}1{2}3 ['0', '2']

编辑以扩展列表理解

关于列表理解的大量信息,http://treyhunner.com/2015/12/python-list-comprehensions-now-in-color/ 非常基础,足以理解我的答案的列表理解

我们可以在其部分之间用换行符重写理解,这可能有助于阅读:

c = [e.split('}')[0]
            for e in s.split('{')
                if '}' in e]

我们可以在等价的 for 循环中完成所有事情:

def in_curly(s):    
    new_list = []
    for e in s.split('{'):
        if '}' in e:
            new_list.append(e.split('}')[0])
    return new_list

c = in_curly(s)

说:

s ='35{0}17{2}3'

可以在http://pythontutor.com实时执行可视化模式下单步执行上述任一或两者

【讨论】:

  • 我不太明白。抱歉,我对理解比较陌生,所以单行看起来很混乱。
  • 添加了一些关于理解列表理解的内容
  • 谢谢!我已经理解了理解! :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-20
  • 1970-01-01
  • 1970-01-01
  • 2019-12-13
  • 2011-12-18
  • 1970-01-01
  • 2013-03-16
相关资源
最近更新 更多