获取由未知分隔符分隔的字符串中的最后一个数字

时间:2018-06-04 03:37:24

标签: python regex

我正在尝试解析标题,我无法弄清楚如何隔离字符串中的最后一个数字,我想我已经找到了分隔符(使用那些嵌套的if语句),但我仍然失败了我自己测试用例。有什么建议吗?

当前输出:

1801 (150@$5): 150
0055 30 @ $5: 30
leaver - 8 @ $10: 8
ATS-55) - 45/$2: 45

结束目标:

import re

def getSlots(title):
    x=title.split('@')
    if len(x)<2: #this means @ wasnt used as the delimeter
        x=title.split('/')
        if len(x)<2:
            x=title.split(' ')
            if len(x)<2:
                return "unsolvable";

    m = re.search('\d+', x[0])
    return m.group(0);

testlist=['1801 (150@$5)','0055 30 @ $5','leaver - 8 @ $10','ATS-55) - 45/$2']
for t in testlist:
    print(t+': '+getSlots(t))

我的代码

endPoint

3 个答案:

答案 0 :(得分:0)

假设您要查找的数字始终是美元符号左侧连续的连续数字的集合,则以下内容似乎有效:

lines = [
    '1801 (150@$5): 1801',
    '0055 30 @ $5: 0055',
    'leaver - 8 @ $10: 8',
    'ATS-55) - 45/$2: 55',
]

def extract(line):
    # Assumes there's only one $ symbol
    dsp = line.index('$')

    # Find last index
    last_index = dsp - 1
    while not line[last_index].isdigit():
        last_index -= 1

    # Find first index
    first_index = last_index
    while line[first_index-1].isdigit():
        first_index -= 1

    return line[first_index:last_index+1]

for line in lines:
    print(extract(line))

<强>结果:

'1801 (150@$5): 1801'       => 150
'0055 30 @ $5: 0055'        =>  30
'leaver - 8 @ $10: 8'       =>   8
'ATS-55) - 45/$2: 55',150   =>  45

注意extract()的返回值是一个字符串,您可能希望将其转换为int。

答案 1 :(得分:0)

使用正则表达式并假设所需数字字符串后跟一个或多个空格,@/字符以及最终$

import re

testlist = ['1801 (150@$5)', '0055 30 @ $5', 'leaver - 8 @ $10', 'ATS-55) - 45/$2']

for s in testlist:
    match = re.search(r'(\d+)[ @/]+\$', s)
    if match:
        print('{}: {}'.format(s, match.groups()[0]))

<强>输出

1801 (150@$5): 150
0055 30 @ $5: 30
leaver - 8 @ $10: 8
ATS-55) - 45/$2: 45

答案 2 :(得分:0)

您可以提取一个数字序列(\d+),后跟0 +空白字符,然后是@/(使用(?=\s*[@/])前瞻)。请注意,您可以更新[@/]字符类以包含更多分隔字符,或者如果分隔字符串是字符序列,则添加|...

import re
lst = ['1801 (150@$5)', '0055 30 @ $5', 'leaver - 8 @ $10', 'ATS-55) - 45/$2', 'Not solvable']
for s in lst:
    m = re.search(r'\d+(?=\s*[@/])', s)
    if m:
        print("{}: {}".format(s, m.group()))
    else:
        print("{}: unsolvable".format(s))

参见Python演示,输出:

1801 (150@$5): 150
0055 30 @ $5: 30
leaver - 8 @ $10: 8
ATS-55) - 45/$2: 45
Not solvable: unsolvable

模式详情

  • \d+ - 1+位数
  • (?=\s*[@/]) - 一个肯定存在(需要存在)的正向前瞻
    • \s* - 0个或更多空白字符
    • [@/] - @/字符。