python检查并替换一个数字

时间:2017-01-22 20:32:49

标签: python

我是python的初学者.. 我的数据线看起来像这样

2015-04-18 10 101011
2015-04-18 10 102000 
2015-04-18 20 222222
2015-04-18 20 100000

如果下面提到的使用()的字符是10,我想将其替换为1 2如果是20

 2015-04-18 10 101011 to 2015-04-18 1 101011
 2015-04-18 20 101011 to 2015-04-18 2 101011

我逐行阅读

with open("test.txt",'r') as f:

file = f.readlines()
for each in file:

我将如何在这里给出一个if语句......

2 个答案:

答案 0 :(得分:1)

正则表达式是可能的,但可能有点矫枉过正。以下是使用split()的解决方案:

DATA =\
"""2015-04-18 10 101011
2015-04-18 10 102000 
2015-04-18 20 222222
2015-04-18 20 100000"""

def process_data(data):
    substitutions = {'10':'1', '20':'2', '30':'3'}
    for line in data.splitlines():
        components = line.split()
        components[1] = substitutions[components[1]]
        yield ' '.join(components)

if __name__ == '__main__':
    for line in process_data(DATA):
        print(line)

<强>输出

2015-04-18 1 101011
2015-04-18 1 102000
2015-04-18 2 222222
2015-04-18 2 100000

<强>假设

由于您的问题中没有明确的细节,我将列出我对此实施所做的假设:

  • 每行数据中至少包含一个空格(否则components[1]将导致IndexError被提升。
  • 第一个空格后面的数据将是“10”或“20”,然后是另一个空格。
  • 每行中的所有空白分区都是单个空间。 Otherwise ' '.join(components)将生成与原始行间距不同的行。

对输入(“10”和“20”)与其替换(“1和2”)之间的关系没有做出任何假设。从这个非常小的数据集看起来像f(x) = x/10,但只有你肯定知道。如有必要,您可以根据您的使用情况调整替换逻辑。

答案 1 :(得分:1)

使用app.Use(async (context, next) => { if (context.Request.IsHttps) await next(); else { var sslPortStr = ((sslPort == 0) || (sslPort == 443)) ? string.Empty : ($":{sslPort}"); var sslUrl = $"https://{context.Request.Host.Host}{sslPort}{context.Request.Path}"; context.Response.Redirect(sslUrl); } }); app.UseStaticFiles(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); 函数与替换回调的解决方案:

re.sub

输出:

def shortenDigits(m):
    d = {'10': '1', '20': '2', '30': '3'}
    val = m.group(2)
    return m.group(1) + (val if val not in d else d[val])

with open('test.txt', 'r') as fh:
    lines = fh.readlines()
    replaced = [re.sub(r'^(\d{4}-\d{2}-\d{2} )(\d{2})', shortenDigits, l) for l in lines]

print(replaced)