如何在多个条件下分割一个字符串

问题描述:

我有一串格式为“我想分割的缩写 - 月 - 年”的字符串。但是,由于用户输入,确切的格式不一致。一些例子:如何在多个条件下分割一个字符串

'AA-JAN17' 
'AA- JAN 17' 
'AA-JAN-17' 
'AA - JAN - 17' 
'AA - 01 - 2017' 

我想要的是['AA', 'JAN', '17']。转换01到JAN或2017到17是微不足道的。

我可以拆分一个连字符和做

st = 'AA-JAN-17' 
list = [s.strip() for s in st.split('-')] 

删除空格,将工作,除了那里是年份和月份之间没有连字符的第一和第二个例子。我大概可以分为两个字母/数字和连字符,但我不知道如何做到这一点。这也许可以用正则表达式做,但我不熟悉的,在所有。

我接受,可以输入字符串的方式有很多种,但是如果有什么东西可以用于上面的所有例子,那么这对大多数情况来说都是足够好的。

+0

[此处输入链接的描述(https://*.com/questions/4998629/python-split-string-with-multiple-delimiters )看一看,我认为这很有帮助。 –

你确实可以使用正则表达式。我会建议任何系列或数字,或任何系列的字母匹配一个:

import re 
lst = re.findall(r"\d+|[a-z]+", "AA-JAN17", re.I) 
+0

谢谢!这似乎运作良好,没有对输入进行任何假设。我想我需要开始学习一些正则表达式。由于我的声望得分太低,我似乎无法赞成。 – TaariqHassan

我推荐一个正则表达式是这样的:

import re 

samples = ['AA-JAN17', 
      'AA- JAN 17', 
      'AA-JAN-17', 
      'AA - JAN - 17', 
      'AA - 01 - 2017', 
      "AA0117"] 

input_pat = re.compile(r"([a-z]{2})[- ]*([a-z]{3}|[0-9]{2})[- ]*([0-9]*)", re.I) 

for sample in samples: 
    print(input_pat.match(sample).groups()) 

这将有以下的输出:

('AA', 'JAN', '17') 
('AA', 'JAN', '17') 
('AA', 'JAN', '17') 
('AA', 'JAN', '17') 
('AA', '01', '2017') 
('AA', '01', '17') 

它提出了一些假设(首字母缩写正好是2个字符,月份将是三个字母或两个数字),您可以修改它们。

我会建议使用此正则表达式。根据您输入的结构(或不是)的结构,您可能不得不花费一些努力找到正确处理所有情况的表达式。我对于迄今已提到将所有情况:

r"(?P<initials>\w+)\s*-?\s*(?P<month>\d{1,2}|JAN\w*)\s*-?\s*(?P<year>\d{2,4})" 

你可以学习与任意数量的正则表达式在线评估的效果。我使用this one

这应该给你,你找什么

string = 'AA - 01 - 2017' 
string = string.replace(' ', '') 
string = string.replace('-', '') 
string = string.replace('20', '') 
date_list = [string[0] + string[1], str(string[2]) + str(string[3]), str(string[4]) + str(string[5])] 
print(date_list)