我有一个csv
文件,其中包含如下所示的列:
XYZ Mon-FR ABC
XY Mo-Fr AB
Xy M-F AbC
xyz MON-FRI ABC
XYZ Mon-Su ABC
XYZ Sat-Sun ABC
XXX SaSu ABC
XY MF & Sa ABC
一旦我加载文件,我怎样才能提取 - 使用python中的正则表达式 - 每个字符串中提到的星期几,这样我就会得到另一个列,其中包含以下各行的以下内容:
Monday-Friday
Monday-Friday
Monday-Friday
Monday-Friday
Monday-Sunday
Saturday-Sunday
Saturday-Sunday
Monday-Friday & Saturday
我似乎无法找到满足所有可能差异的正则表达式,如上例所示。
答案 0 :(得分:1)
我会创建一个使用一组替换的函数。由您来定义替换,即确保它们是完整的。涵盖所有可能性的正则表达式可能会变得不可读。
因此,像:
def alter(field):
text = " ".join(field.split()[1:-1])
text = text.replace("Mon-FR", "Monday-Friday")
text = text.replace("Mo-Fr", "Monday-Friday")
<etc>
return text
如果对于像XY MF & Sa ABC
这样的情况,您不确定&
周围的间距(使得更难匹配确切的字符串),您可以简单地使用空连接字符串在第一行:"".join(...
。
如果您有很多情况,其中日期和日期范围是“和”-ed(Mo-We & Fr & Sun
,例如,您可以尝试按&
拆分并分别替换每个子字段。
答案 1 :(得分:1)
使用正则表达式的以下方法应该有效:
from itertools import chain
import csv
import re
days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
days_rep = [[day.lower()[:l] for l in xrange(len(day), 0, -1)] for day in days]
days_rep = sorted(chain.from_iterable([(len(day), day, index) for day in days] for index, days in enumerate(days_rep)), reverse=True)
days_d = {day : ' {} '.format(days[value]) for length, day, value in days_rep}
re_days = re.compile(r'({})'.format('|'.join(day for length, day, value in days_rep)), flags=re.I)
def normalise(entry):
to_days = re_days.sub(lambda x: days_d[x.group(1).lower()], entry)
return to_days.replace(' ', ' ').replace(' - ', '-').strip()
with open('input.csv', 'rb') as f_input:
for cols in csv.reader(f_input):
print "{} {} {}".format(cols[0], normalise(cols[1]), cols[2])
这假设您有一个csv
文件,如下所示:
XYZ,Mon-FR,ABC
XY,Mo-Fr,AB
Xy,M-F,AbC
xyz,MON-FRI,ABC
XYZ,Mon-Su,ABC
XYZ,Sat-Sun,ABC
XXX,SaSu,ABC
XY,MF & Sa,ABC
它将显示以下输出:
XYZ Monday-Friday ABC
XY Monday-Friday AB
Xy Monday-Friday AbC
xyz Monday-Friday ABC
XYZ Monday-Sunday ABC
XYZ Saturday-Sunday ABC
XXX Saturday Sunday ABC
XY Monday Friday & Saturday ABC
该脚本首先根据长度顺序的星期几构建正则表达式,如下所示:
(wednesday|wednesda|thursday| .... mond|frid|wed|tue|thu|sun|sat|mon|fri|we|tu|th|su|sa|mo|fr|w|t|t|s|s|m|f)
这用于查找字典中的相应全文。最后修改格式以删除额外的间距。