python正则表达式前瞻性正+;消极的
这个正则表达式将得到456。我的问题是为什么它不能是1-234-56中的234?56是否限定(?!\d))模式,因为它不是单个数字。(?!\d))将寻找的起点在哪里python正则表达式前瞻性正+;消极的,python,regex,regex-lookarounds,Python,Regex,Regex Lookarounds,这个正则表达式将得到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) 第一阶段是添加逗号分隔符,如123456 a = pattern.findall("The num
import re
pattern = re.compile(r'\d{1,3}(?=(\d{3})+(?!\d))')
a = pattern.findall("The number is: 123456") ; print(a)
第一阶段是添加逗号分隔符,如123456
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))
要求在1-3位序列之后出现3位序列<代码>56(想象场景中的最后一个数字组)是一个2位数的组。由于量词可以是懒惰的,也可以是贪婪的,因此不能将一位、两位和三位数字组与\d{1,3}
匹配。要从123456
中获取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)
不,这是一个负前瞻,它不匹配,它只检查输入字符串中当前位置之后是否没有数字。如果有数字,则匹配失败(未找到并返回结果)
关于前瞻性的更多说明:它位于(\d{3})+
子模式之后,因此正则表达式引擎开始搜索最后一个3位数组之后的一个位数,如果找到该位数,则匹配失败(因为它是负前瞻性的)。简单地说,在这个正则表达式中,(?!\d)
是一个关闭/尾随边界的数字
更详细的分类:
-1到3位序列,尽可能多(使用贪婪量词)\d{1,3}
-一种积极的前瞻((?=(\d{3})+(?!\d))
)方法,用于检查之前匹配的1-3位序列是否后跟(?=…)
-1个或多个((\d{3})+
)正好3位数字的序列+
-后面没有数字(?!\d)
123
与\d{1,3}
匹配,因为这样就有了3位序列(456
)。但是,456
是在一个前瞻中设置的,如果设置了捕获组,则只返回捕获的文本
要仅添加逗号作为数字分组符号,请使用
rx = r'\d(?=(?:\d{3})+(?!\d))'
请参见如果您告诉regex您希望它做什么,它会有所帮助您是如何得到
123-456
?代码>是负前瞻标记,所以\d
将在没有单一数字签名的情况下向前看。我只是好奇为什么不能像1-234-56那样解析整个数字\d只排除一位数,56不是一位数。在你的正则表达式中,我运行import-re-pattern=re.compile(r'\d{1,3}(?=(\d{3})+(?!\d)))a=pattern.findall(“数字是:123456”)打印(a)
我得到['456]
不是我写的。:-)对不起,前面的问题不准确。已经修好了。@Ascanio:它能回答你的问题吗?或者您是否需要进一步澄清(?!\d)
的工作原理?是的!你能读懂我的心思!这就是问题的根本原因。@Ascanio:我已经补充了更多的澄清,并更新了“主要”问题的答案。你有一个误解。您尚未阅读有关re.findall
的信息。Lookaheads不匹配,不使用字符,但您仍然可以捕获其中的字符。执行前瞻时,正则表达式索引与前面的字符相同。将123
与\d{1,3}
匹配,因为这样就有了3位序列(456
)。但是,456
在一个前瞻中被捕获,如果设置了捕获组,re.findall
只返回捕获的文本。