2014-02-09 51 views
0

我正在做一個日期規範化的東西,其中沒有把有效格式的日期更改爲有效的格式。例如使用正則表達式的日期規範化

1|1/2002 

變得

01-01-2002 

5|9-20 

變得

05-09-0020 

定界符僅限於[ -/| ]以及任何不遵循的輸入已經被拋出列表。

應用re.sub(模式,REPL,串,數= 0,旗幟= 0)

我看着庫的例子,但真的找不到任何有助於分析數據。

>>> def dashrepl(matchobj): 
...  if matchobj.group(0) == '-': return ' ' 
...  else: return '-' 
>>> re.sub('-{1,2}', dashrepl, 'pro----gram-files') 
'pro--gram files' 
>>> re.sub(r'\sAND\s', ' & ', 'Baked Beans And Spam', flags=re.IGNORECASE) 
'Baked Beans & Spam' 

回答

4

使用捕獲組:

>>> import re 
>>> 
>>> pattern = re.compile(r'\b(\d{1,2})\D(\d{1,2})\D(\d{1,4})\b') 
>>> def repl(match): 
...  return '{:0>2}-{:0>2}-{:0>4}'.format(*match.groups()) 
... 
>>> pattern.sub(repl, '1|1/2002') 
01-01-2002 
>>> pattern.sub(repl, '5|9-20') 
05-09-0020 
+0

這真的很有幫助!謝謝!它叫做什麼:0> 2你做到了。我想了解更多。謝謝! –

+0

@LeonardLie,'0'是填充字符。 '>'是正確對齊。 '2'是寬度。 – falsetru

+0

@LeonardLie,請參閱[格式字符串語法](http://docs.python.org/3/library/string.html#formatstrings)。 – falsetru

1
import re 
def format_date_string(data): 
    zmap = {0:2, 1:2, 2:4} 
    return "-".join(p.zfill(zmap[i]) for i,p in enumerate(re.split("[|/-]",data))) 

print(format_date_string("1|1/2002")) # 01-01-2002 
print(format_date_string("5|9-20"))  # 05-09-0020 
0
import re 

def convert_format(d): 
    m = re.match('(\d+).(\d+).(\d+)', d) 
    if m: 
     m = [int(x) for x in m.groups()] 
     return '%0.2d-%0.2d-%0.4d' % (m[0], m[1], m[2]) 
    else: 
     return False 

for d in ('1|1/2002', '5|9-20'): 
    print convert_format(d) 

輸出:

01-01-2002 
05-09-0020 

OR:

import re 

def convert_format(d): 
    m = re.findall('\d+', d) 
    if m: 
     m = [int(x) for x in m] 
     return '%0.2d-%0.2d-%0.4d' % (m[0], m[1], m[2]) 
    else: 
     return False 

for d in ('1|1/2002', '5|9-20'): 
    print convert_format(d) 
+0

我沒有downvote。輸出不是OP想要的。 – falsetru

+0

是問題的一部分? –