python正则表达式向前看正面+负面

问题描述:

这个正则表达式将得到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-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)'是如何工作的? –