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)
我的问题是,为什么不能从
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)
- 后面没有数字。
-
向前看符号不匹配,不消耗字符,但你仍然可以捕获在他们里面。当一个lookahead被执行时,正则表达式索引与前面的字符相同。 随着你的正则表达式和输入,你匹配123
与\d{1,3}
因为那么你有3位数字序列(456
)。但是456
是在预见范围内被捕获,并且re.findall
仅在捕获组被设置时才返回捕获的文本。
只需添加逗号作为数字分组符号,使用
rx = r'\d(?=(?:\d{3})+(?!\d))'
任何评论为什么它被downvoted? –
不是由我。 :-)我很抱歉前面的不准确的问题。已修复它。 – Ascanio
@Ascanio:它回答你的问题吗?或者你需要更多的说明'(?!\ d)'是如何工作的? –
它会帮助,如果你告诉你期待什么样的正则表达式做 – hjpotter92
你怎么'123- 456'? – vks
'?!'是否定前置标记,所以如果没有单个数字,那么'!!\ d'将向前看 – SIslam