Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python正则表达式前瞻性正+;消极的_Python_Regex_Regex Lookarounds - Fatal编程技术网

python正则表达式前瞻性正+;消极的

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

这个正则表达式将得到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 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)
是一个关闭/尾随边界的数字

更详细的分类:

  • \d{1,3}
    -1到3位序列,尽可能多(使用贪婪量词)
  • (?=(\d{3})+(?!\d))
    -一种积极的前瞻(
    (?=…)
    )方法,用于检查之前匹配的1-3位序列是否后跟
    • (\d{3})+
      -1个或多个(
      +
      )正好3位数字的序列
    • (?!\d)
      -后面没有数字
Lookaheads不匹配,不使用字符,但您仍然可以捕获其中的字符。执行前瞻时,正则表达式索引与前面的字符相同使用正则表达式和输入,将
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
只返回捕获的文本。