2017-06-02 83 views
2

我也有類似像如何用連字符中的空格替換連字符( - ),而字符串中的匹配模式除外?

text='Studied b-tech from college in 2010-13' 

text.replace('-',' ') 

字符串這會給

Studied b tech from college in 2010 13 

我想是這樣的:

Studied b tech from college in 2010-13 

我已經準備下面的圖案爲grepping像2010-13但令牌我如何在我的代碼中使用它?

regex_pattern='(\d{4}-\d{2,4})' 
+0

https://docs.python.org/3/library/re.html –

+0

你知道'text.replace ('b-tech','b tech')'?或者是否有更多需要更換的輸入?像2010-13的一切一樣? – Neil

回答

1

你要描述使用負lookarounds你連字符的兩種可能性:

  • 不由四位數字之前:(?<!\b[0-9]{4})
  • 不後跟兩個或四個數字:(?![0-9]{2}(?:[0-9]{2})?\b)

「不是由不繼以B開頭」否定 「由A 前面隨後B」

例如:

import re 

text = 'Studied b-tech from college in 2010-13' 

result = re.sub(r'-(?:(?<!\b[0-9]{4}-)|(?![0-9]{2}(?:[0-9]{2})?\b))', ' ', text) 

demo

(寫- (?: (?<! ... -) | (?! ...))(?<! ...)-|-(?! ...)更高效,這就是爲什麼你檢索的回顧後連字符)

+0

我認爲這是最健壯的答案。一個問題,但。 '(<\ d {4}?!) - '這表情好像給你相同的答案,但它是更接近你說的是效率較低的選項(\ d {2}?!)。你能否詳細說明爲什麼效率較低?我的正則表達式非常天真。 – rwhitt2049

+0

@ rwhitt2049:' - '是錯誤的,因爲它不符合像'ABC-12'或'1234-abc'或'12345(<\ d {4}?!)(\ d {2}?!) -6789'。關於爲什麼' - (?:?!?!(

0

沒有爲replace第三個可選參數,可以讓你表示你想,以取代實例。

text.replace('-',' ', 1) 
+0

如果字符串是這樣仍然工作: 'text ='在2010-13學習b科技從大學' – Jeremy

+0

我假設你的意思是'文本='在2010年至2010年在B - 學院學習b科技大學''?如果是這樣,不,它不會工作。您已更改您的要求,請更新您的原始問題。 – etemple1

+0

這不是我的問題:)我只是想,如果在OP想辦法刪除不用於日期連字符的所有實例,應該有比更換一審更好的辦法。 – Jeremy

0

Python的字符串replace需要max參數含義發生更換的最大數量。

如果你只想1日使用text.replace(*, 1)

0

我會使用Python的.replace()在正則表達式在這裏。

喜歡的東西:

str.replace(old, new[, max])

其中max是你將要替換的實例的數量。如果你只是想替換非數字字符串的連字符,我會用類似於這個問題的東西:How do I check if a string is a number (float) in Python?而不是改變它來捕捉如果連字符旁邊的字符是數字。

1

我知道你在尋找的是:

>>> import re 
>>> text = "Studied b-tech from college in 2010-13" 

>>> re.sub("\-([a-zA-Z]+)", r"\1", text) 
"Studied btech from college in 2010-13" 

[a-zA-Z]將不匹配以數字-之後到來。你可以找到更多關於re.subhere

+1

這是正確的答案。我認爲'.replace()'可以工作,但是有條件的,它太瘋狂了。 – Jeremy

0

你只需要匹配反模式

正則表達式:(\d{0,3}(?:\D|^)\d{0,3})-(\d?(?:\D|$)\d?)
取代:$1 $2

相關問題