[英]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
是在先行中capured和re.findall
如果捕獲組設置只返回捕獲文本。
要將逗號添加為數字分組符號,請使用
rx = r'\d(?=(?:\d{3})+(?!\d))'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.