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

时间:2017-10-18 21:06:25

标签: python string python-3.x list split

我有一堆格式的字符串"缩写 - 月 - 年"我想拆分。但是,由于用户输入,确切的格式不一致。一些例子:

'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('-')]

这将起作用,除了第一个和第二个示例,其中月和年之间没有连字符。我可能会分开字母/数字和连字符,但我不知道该怎么做。这可能是用正则表达式完成的,但我根本不熟悉。

我接受可以输入字符串的方式有多种,但是如果有适合上述所有示例的内容,那么对于大多数情况来说这都足够了。

4 个答案:

答案 0 :(得分:1)

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

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个字符,月份将是三个字母或两个数字),您可以修改。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我建议使用正则表达式。根据输入的结构(或不结构),您可能需要花费一些精力来查找正确处理所有情况的表达式。到目前为止,我提到的所有案例都是:

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

您可以使用任意数量的在线正则表达式评估程序来研究效果。我使用this one

答案 3 :(得分:0)

这可以为您提供所需的内容

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)