2015-11-07 95 views
1

這個正則表達式將得到456.我的問題是爲什麼它不能是從234到234的234? 56是否符合(?!\ d))模式,因爲它不是一個數字。 (?!\ d))的起點在哪裏?python正則表達式向前看正面+負面

import re 
pattern = re.compile(r'\d{1,3}(?=(\d{3})+(?!\d))') 
a = pattern.findall("The number is: 123456") ; print(a) 

這是在第一階段添加像逗號分隔符123,456。

a = pattern.findall("The number is: 123456") ; print(a) 
results = pattern.finditer('123456') 
    for result in results: 
    print (result.start(), result.end(), result) 
+0

它會幫助,如果你告訴你期待什麼樣的正則表達式做 – hjpotter92

+0

你怎麼'123- 456'? – vks

+0

'?!'是否定前置標記,所以如果沒有單個數字,那麼'!!\ d'將向前看 – SIslam

回答

1

我的問題是,爲什麼不能從1-234-56234

這是不可能的,因爲(?=(\d{3})+(?!\d))要求3位數序列出現在1-3位數序列之後。 56(您想象的場景中的最後一個數字組)是一個2位數組。由於量詞可能是懶惰或貪婪,因此無法將一個,兩個和三個數字組與\d{1,3}相匹配。要從123456獲得234,您需要爲其專門定製的正則表達式:\B\d{3}(?<=1)\d{3}或甚至\d{3}(?=\d{2}(?!\d))

56是否與(?!\d))模式匹配? (?!\ d))的起點在哪裏?

不,這是一個負向前視,它不匹配,它只檢查輸入字符串中當前位置之後是否沒有數字。如果有數字,則匹配失敗(未找到並返回結果)。

關於前瞻的更多說明:它位於(\d{3})+子模式之後,因此正則表達式引擎開始搜索最後3位數組後的數字,並且如果找到數字則失敗匹配(因爲它是負面看法)。簡而言之,(?!\d)是這個正則表達式中的數字結尾/尾隨邊界

的更詳細的故障:

  • \d{1,3} - 1至3位數的序列,儘可能多的(貪婪量詞使用)
  • (?=(\d{3})+(?!\d)) - 正先行((?=...))如果該檢查之前匹配1-3數字序列之後是
    • (\d{3})+ - 恰好3個數字1或更大(+)序列...
    • (?!\d) - 後面沒有數字。

向前看符號不匹配,不消耗字符,但你仍然可以捕獲在他們裏面。當一個lookahead被執行時,正則表達式索引與前面的字符相同。 隨着你的正則表達式和輸入,你匹配123\d{1,3}因爲那麼你有3位數字序列(456)。但是456在預見範圍內被捕獲,並且re.findall僅在捕獲組被設置時才返回捕獲的文本。

只需添加逗號作爲數字分組符號,使用

rx = r'\d(?=(?:\d{3})+(?!\d))' 

IDEONE demo

+0

任何評論爲什麼它被downvoted? –

+0

不是由我。 :-)我很抱歉前面的不準確的問題。已修復它。 – Ascanio

+0

@Ascanio:它回答你的問題嗎?或者你需要更多的說明'(?!\ d)'是如何工作的? –