如何在 Python 中的 csv 行中提取 , 和括号(如果存在)之间的内容
How do you extract content between , and Parenthesis(if present) in a csv ROW, in Python
csv内容如下:
"Washington-Arlington-Al, DC-VA-MD-WV (MSAD)" 47894 1976
"Grand-Forks, ND-MN" 24220 2006
"Abilene, TX" 10180 1977
需要的输出通过csv读取,找到""之间的内容
在第 1 列中,仅获取 DC-VA-MD-WV 、 ND-MN 、 TX 和
将此内容放在一个新栏中。 (用于规范化)
到目前为止在 python 中尝试了很多正则表达式模式,但找不到正确的模式。
sample=""" "Washington-Arlington-Al, DC-VA-MD-WV (MSAD)",47894,1976
"Grand-Forks, ND-MN",24220,2006
"Abilene, TX",10180,1977 """
open('sample.csv','w').write(sample)
with open('sample.csv') as sample, open('output.csv','w') as output:
reader = csv.reader(sample)
writer = csv.writer(output)
for comsplit in row[0].split(','):
writer.writerow([ comsplit, row[1]])
print open('output.csv').read()
预期输出为:
DC-VA-MD-WV
ND-MN
TX
新一行
我会这样做:
with open('csv_file.csv', 'r') as f_in, open('output.csv', 'w') as f_out:
csv_reader = csv.reader(f_in, quotechar='"', delimiter=',',
quoting=csv.QUOTE_ALL, skipinitialspace=True)
csv_writer = csv.writer(f_out)
new_csv_list = []
for row in csv_reader:
first_entry = row[0].strip('"')
relevant_info= first_entry.split(',')[1].split(' ')[0]
row += [relevant_info]
new_csv_list += [row]
for row in new_csv_list:
csv_writer.writerow(row)
如果您有任何问题,请告诉我。
这里不需要使用正则表达式,前提是:
- 城市 (?) 后面总是有一个逗号,后面跟着 1 space 的白色 space(尽管我可以添加修改以接受超过 1 位的白色space 如果需要)
- 在遇到
(MSAD)
. 之类的字母之前,您的字母序列后有一个 space
此代码针对示例输入给出了您的预期输出:
with open('sample.csv', 'r') as infile, open('expected_output.csv', 'wb') as outfile:
reader = csv.reader(infile)
expected_output = []
for row in reader:
split_by_comma = row[0].split(',')[1]
split_by_space = split_by_comma.split(' ')[1]
print split_by_space
expected_output.append([split_by_space])
writer = csv.writer(outfile)
writer.writerows(expected_output)
您似乎无法找到正确的 regex
来查找预期值。
我已经创建了一个小样本 pythext 可以满足您的要求。
基本上,当您检查第一列的每个值的内容时,您可以使用像 /(TX|ND-MN|DC-VA-MD-WV)/
这样的正则表达式
我希望这有用!如果您需要进一步的解释,请告诉我。
我相信你可以使用这个正则表达式模式,它将提取逗号和括号之间的任何字母数字表达式(带连字符或不带连字符):
import re
BETWEEN_COMMA_PAR = re.compile(ur',\s+([\w-]+)\s+\(')
test_str = 'Washington-Arlington-Al, DC-VA-MD-WV (MSAD)'
result = BETWEEN_COMMA_PAR.search(test_str)
if result != None:
print result.group(1)
这将打印结果:DC-VA-MD-WV
,正如预期的那样。
csv内容如下:
"Washington-Arlington-Al, DC-VA-MD-WV (MSAD)" 47894 1976
"Grand-Forks, ND-MN" 24220 2006
"Abilene, TX" 10180 1977
需要的输出通过csv读取,找到""之间的内容 在第 1 列中,仅获取 DC-VA-MD-WV 、 ND-MN 、 TX 和 将此内容放在一个新栏中。 (用于规范化)
到目前为止在 python 中尝试了很多正则表达式模式,但找不到正确的模式。
sample=""" "Washington-Arlington-Al, DC-VA-MD-WV (MSAD)",47894,1976
"Grand-Forks, ND-MN",24220,2006
"Abilene, TX",10180,1977 """
open('sample.csv','w').write(sample)
with open('sample.csv') as sample, open('output.csv','w') as output:
reader = csv.reader(sample)
writer = csv.writer(output)
for comsplit in row[0].split(','):
writer.writerow([ comsplit, row[1]])
print open('output.csv').read()
预期输出为:
DC-VA-MD-WV
ND-MN
TX
新一行
我会这样做:
with open('csv_file.csv', 'r') as f_in, open('output.csv', 'w') as f_out:
csv_reader = csv.reader(f_in, quotechar='"', delimiter=',',
quoting=csv.QUOTE_ALL, skipinitialspace=True)
csv_writer = csv.writer(f_out)
new_csv_list = []
for row in csv_reader:
first_entry = row[0].strip('"')
relevant_info= first_entry.split(',')[1].split(' ')[0]
row += [relevant_info]
new_csv_list += [row]
for row in new_csv_list:
csv_writer.writerow(row)
如果您有任何问题,请告诉我。
这里不需要使用正则表达式,前提是:
- 城市 (?) 后面总是有一个逗号,后面跟着 1 space 的白色 space(尽管我可以添加修改以接受超过 1 位的白色space 如果需要)
- 在遇到
(MSAD)
. 之类的字母之前,您的字母序列后有一个 space
此代码针对示例输入给出了您的预期输出:
with open('sample.csv', 'r') as infile, open('expected_output.csv', 'wb') as outfile:
reader = csv.reader(infile)
expected_output = []
for row in reader:
split_by_comma = row[0].split(',')[1]
split_by_space = split_by_comma.split(' ')[1]
print split_by_space
expected_output.append([split_by_space])
writer = csv.writer(outfile)
writer.writerows(expected_output)
您似乎无法找到正确的 regex
来查找预期值。
我已经创建了一个小样本 pythext 可以满足您的要求。
基本上,当您检查第一列的每个值的内容时,您可以使用像 /(TX|ND-MN|DC-VA-MD-WV)/
我希望这有用!如果您需要进一步的解释,请告诉我。
我相信你可以使用这个正则表达式模式,它将提取逗号和括号之间的任何字母数字表达式(带连字符或不带连字符):
import re
BETWEEN_COMMA_PAR = re.compile(ur',\s+([\w-]+)\s+\(')
test_str = 'Washington-Arlington-Al, DC-VA-MD-WV (MSAD)'
result = BETWEEN_COMMA_PAR.search(test_str)
if result != None:
print result.group(1)
这将打印结果:DC-VA-MD-WV
,正如预期的那样。