繁体   English   中英

如何使用 python 中的正则表达式/拆分字符串将字符串的一部分放入 csv 文件?

[英]how to get the part of string into a csv file using regular expression/split string in python?

这是 csv 文件我在数据库中有一个名为 build_ID 的列,它的值如下所示

build ID

5.30-420486
5.30-421040
5.30-421225
5.30-420664

我将这些值提取到 csv 文件中。 但我只想获取

420486
421040
421225
420664

我只想将这些值提取到 csv 文件中,我不想像这样提取5.30-420486。 我只想将 5.30- 之后的数字提取到 csv 文件中。

有人可以帮我解决这个问题。

问候,达山

def fetch_results():
    query = r"select build_id,pass_percent,original_pass_percent from test_summary where 
    test_suite='%s'"
    test_suite_list=['CI-FIT-Nitro','CI-FIT-Potash','SAT-C7000','SAT-Synergy','SAT-Synergy- 
    gen1','SAT-Synergy-gen2','Scale','Scale-DCS-VET','UPT_C7000','UPT_Synergy']
   
    row_headers, rows = run_query_and_return_results(query,test_suite_list)
    
    if not rows:
       print("Empty rows")
    else:
       print("Rows :" + str(rows))
       return rows
row12 = fetch_results()

for i in row12:
    with open('%s_graph22.csv'%i,'w') as out:
        csv_out=csv.writer(out)
        csv_out.writerow(['build ID','Pass Percentage', 'original_pass_percent'])
        for row in row12[i]:
            csv_out.writerow(row)

在此处输入图像描述

如果是单行 - 您只需要使用:

split('-')[1]

对于您的第一个 ex(在一行中显示所有内容),您可以这样使用 re 库:

import re

string = "5.30-420486 5.30-421040 5.30-421225 5.30-420664"

matches = re.findall(r'\d*\.?\d*-(\d+)', string)
print(matches)

output:

['420486', '421040', '421225', '420664']

假设您的代码有效(没有数据和它的 rest 很难判断),您只需要更改此行:

csv_out.writerow(row)

类似于:

csv_out.writerow([row[0][5:], *row[1:]])

或者,如果您只想要第一个破折号的 position 之后的所有内容并且想使用正则表达式(尽管有更简单的方法可以进行这样的匹配),请在开始时import regex并:

csv_out.writerow([re.match('^.*?-(.*)$', row[0]).group(1), *row[1:]])

假设每一行至少有一个破折号。

一点解释:如果你有一个列表(例如xs = [1, 2, 3, 4] )并且你做了类似[xs[0]+1, *x[1:]]的事情,你会得到一个新列表它具有列表x[0]的第一个元素,并对其执行了一些操作,例如+1 ,然后是列表x[1:]的 rest ,它是列表中从索引1处的元素开始的每个元素。 星号*用于“解包”列表,以确保新列表包含列表中的元素,而不是列表本身。

xs = [1, 2, 3, 4]
print([xs[0]+6, *xs[1:]])  # prints [7, 2, 3, 4]
print([xs[0]+6, xs[1:]])  # prints [7, [2, 3, 4]]

正则表达式'^.*?-(.*)$'只是说匹配字符串的开始^和结束$之间的所有内容,从最小数量的字符开始直到第一个破折号.*?- ,然后是组中捕获的所有其他内容(.*) 这就是为什么.group(1)然后让你得到你所追求的字符串的一部分。

你可能没有^$ ,但我把它们放在那里是为了明确。 如果字符串只包含'123-456789' ,没有也可以。 例如,如果字符串包含像'"123-456789"'这样的引号,那么您需要这些引号而不是开始和结束标记。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM