我有一个文字字符串,其中包含下半部分格式为%d.%m.%y %H:%M
加|
的日期。前半部分包含用户的名称,其长度可以变化,可以包含数字,可以有多个尾随空格以及名称部分内的多个空格。例如:
john smith 23 21.01.1994 02:23|
mr magoo 30.04.05 23:37|
Mr bing bong 29.01.10 20:53|
我怎样才能安全地将字符串分成两部分?
此
name_date = "john smith 23 21.01.1994 02:23"
name = name_date.split(" ")[0].encode('utf-8').strip()
date = name_date.split(" ")[1].encode('utf-8').strip()
date = date.split(" |")[0]
大部分时间都有效,但仍然忽略了名称中4个空格()的情况。
答案 0 :(得分:1)
这是一个非常适合正则表达式的任务:
import re
dtpattern = re.compile(r'(?<=\s)\d{2}\.\d{2}\.(?:\d{2}|\d{4})\s+\d{2}:\d{2}(?=|)')
date = dtpattern.search(name_date).group()
这匹配数字模式(每组数字长2或4位),中间有适当的分隔符;后视和前瞻模式确保匹配仅限于那些具有前面的空格和后面的管道字符的日期。
>>> import re
>>> samples = '''\
... john smith 23 21.01.1994 02:23|
... mr magoo 30.04.05 23:37|
... Mr bing bong 29.01.10 20:53|
... '''.splitlines()
>>> dtpattern = re.compile(r'(?<=\s)\d{2}\.\d{2}\.(?:\d{2}|\d{4})\s+\d{2}:\d{2}(?=|)')
>>> for line in samples:
... print dtpattern.search(line).group()
...
21.01.1994 02:23
30.04.05 23:37
29.01.10 20:53
如果您还需要名称 ,请将空白之前的所有内容以及日期模式分组:
dtpattern = re.compile(r'(.*?)\s+(\d{2}\.\d{2}\.(?:\d{2}|\d{4})\s+\d{2}:\d{2})|')
name, date = dtpattern.search(name_date).groups()
>>> dtpattern = re.compile(r'(.*?)\s+(\d{2}\.\d{2}\.(?:\d{2}|\d{4})\s+\d{2}:\d{2})|')
>>> for line in samples:
... name, date = dtpattern.search(line).groups()
... print name
... print date
...
john smith 23
21.01.1994 02:23
mr magoo
30.04.05 23:37
Mr bing bong
29.01.10 20:53
答案 1 :(得分:0)
如果它始终是最后2项的日期,您可以尝试:
name_date = "john smith 23 21.01.1994 02:23"
name = " ".join(filter(None, name_date.split(" ")[:-2]))
date = " ".join(filter(None, name_date.split(" ")[-2:]))
print name, date
输出:
john smith 23 21.01.1994 02:23
答案 2 :(得分:0)
只使用没有参数的split
,然后您可以轻松获取所需的任何数据,甚至可以放回一个标准化字符串,用空格或逗号分隔。
>>> name_date = name_date.split()
['john', 'smith', '23', '21.01.1994', '02:23|']
>>> name_date[3]
'21.01.1994'
>>> ', '.join(name_date)
'john, smith, 23, 21.01.1994, 02:23|'
>>> ' '.join(name_date)
'john smith 23 21.01.1994 02:23|'