正则表达式从Python中的字符串中选择一周中的几天

时间:2016-02-11 05:47:13

标签: python regex

我有一个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

我似乎无法找到满足所有可能差异的正则表达式,如上例所示。

2 个答案:

答案 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)

这用于查找字典中的相应全文。最后修改格式以删除额外的间距。