2016-07-12 94 views
-1

我有一個字符串:正則表達式和python

myString = "123ABC,'2009-12-23T23:45:58.544-04:00'" 

我想從時間戳提取的 「T」 字,即其更改爲:

"123ABC,'2009-12-23 23:45:58.544-04:00'" 

我想這一點:

newString = re.sub('(?:\-\d{2})T(?:\d{2}\:)', ' ', myString) 

,但返回的字符串是:

"123ABC,'2009-12 45:58.544-04:00'" 

「非捕獲組」似乎不是「非捕獲」,並且它正在移除所有內容。我究竟做錯了什麼?

+3

爲什麼不更換? –

+1

或者,如果你不能替換,像'''.join(myString.split('T'))''? –

+0

這個問題大大低估了。時間戳從哪裏來的?你爲什麼不想要T?你確定時間戳會一直在那個區域嗎?如果不是? –

回答

2

您可以使用lookarounds(正回顧後和-ahead):

(?<=\d)T(?=\d) 

a demo on regex101.com


Python這將是:

import re 
myString = "123ABC,'2009-12-23T23:45:58.544-04:00'" 
rx = r'(?<=\d)T(?=\d)' 
# match a T surrounded by digits 

new_string = re.sub(rx, ' ', myString) 
print new_string 
# 123ABC,'2009-12-23 23:45:58.544-04:00' 

a demo on ideone.com

+0

這工作,但我需要它是更具體的...最大限度地減少匹配其他文本數據的機會......我意識到這種解決方案並不完美,但現在已經足夠了......謝謝......「環顧四周」幫助...需要打磨我的正則表達式技術z newString = re.sub('(?<= \ - \ d {2})T(?= \ d {2} \ :)','',myString)... – Calamari

+0

@Calamari:在Python're'是固定witdth。捕獲組更靈活。使用're.sub(r'( - \ d {2})T(\ d {2} :)',r'\ 1 \ 2',myString)'。定義正則表達式模式時使用原始字符串文字。 –

1

regex似乎有點矯枉過正:

mystring.replace("T"," ") 
+4

加油...如果'myString =「123RST,'2009-12-23T23:45:58.544-04:00'」'怎麼辦? –

+0

@ dot.Py怎麼樣'「」.join(s.rsplit(「T」,1))'然後呢?如果在第一部分中有一個「T」,假設日期始終是最後一部分,也是有效的。 –

0

我會使用捕獲組,未錨定lookbehinds在正則表達式的性能方面是昂貴的:

(\d)T(\d) 

,並用含有r'\1 \2'替換模式反向引用的數字前,T後更換。見regex demo

Python demo

import re 
s = "123ABC,'2009-12-23T23:45:58.544-04:00'" 
reg = re.compile(r'(\d)T(\d)') 
s = reg.sub(r'\1 \2', s) 
print(s) 
+0

如果您需要精確的內容,請使用're.sub(r'( - \ d {2})T(\ d {2} :)',r'\ 1 \ 2',s)'。 –

0

T的數字之間陷入而且將永遠是孤獨的權利。你可以使用一個rsplitjoin

myString = "123ABC,'2009-12-23T23:45:58.544-04:00'" 
s = ' '.join(myString.rsplit('T', maxsplit=1)) 
print(s) 
# "123ABC,'2009-12-23 23:45:58.544-04:00'" 

嘗試此上的領先T在字符串某處:

myString = "123ATC,'2009-12-23T23:45:58.544-04:00'" 
s = ' '.join(myString.rsplit('T', maxsplit=1)) 
print(s) 
# "123ATC,'2009-12-23 23:45:58.544-04:00'"