我有一堆格式的字符串"缩写 - 月 - 年"我想拆分。但是,由于用户输入,确切的格式不一致。一些例子:
'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 :(得分: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)