我正在尝试解析标题,我无法弄清楚如何隔离字符串中的最后一个数字,我想我已经找到了分隔符(使用那些嵌套的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
答案 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个或更多空白字符[@/]
- @
或/
字符。