簡體   English   中英

python正則表達式向前看正負

[英]python regex look ahead positive + negative

這個正則表達式將得到456。我的問題是為什么它不能從1-234-56變為234? 56是否限定(?!\\ d))模式,因為它不是一位數字。 (?!\\ d))尋找的起點在哪里?

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)

我的問題是為什么從1-234-56不能為234

這是不可能的,因為(?=(\\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) -后面沒有數字。

先行者不匹配,不消耗字符,但是您仍然可以在其中捕獲字符。 當執行前瞻時,正則表達式索引與以前的字符相同。 使用正則表達式和input ,將123\\d{1,3}匹配,因為您擁有3位數的序列( 456 )。 456是在先行中capuredre.findall如果捕獲組設置只返回捕獲文本。

要將逗號添加為數字分組符號,請使用

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

IDEONE演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM