繁体   English   中英

正则表达式从Python字符串中选择星期几

[英]Regex to pick days of the week from a string in Python

我有一个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中的regex-每个字符串中提到的星期几,这样我就可以得到上面每一行中包含以下内容的另一列:

Monday-Friday
Monday-Friday
Monday-Friday
Monday-Friday
Monday-Sunday
Saturday-Sunday
Saturday-Sunday
Monday-Friday & Saturday

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

我将创建一个使用一组替换项的函数。 由您决定替换项,即确保替换完成。 涵盖所有可能性的正则表达式可能会变得难以理解。

因此,类似:

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(...

如果在很多情况下,日期和日期范围都是“和”编辑的(例如Mo-We & Fr & Sun ,则可以尝试用&分割,然后分别替换每个子字段。

使用正则表达式的以下方法应该有效:

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)

这用于在字典中查找相应的全文。 最后,固定格式以消除多余的间距。

暂无
暂无

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

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