gpt4 book ai didi

python - 匹配前面或后面没有数字的特定数量的数字

转载 作者:太空宇宙 更新时间:2023-11-04 10:01:42 25 4
gpt4 key购买 nike

我有一个字符串:

string = u'11a2ee22b333c44d5e66e777e8888'

我想找到所有k连续的数字 block ,其中 n <= k <= m .

仅使用正则表达式:比如说n=2m=3 使用 (?:\D|^)(\d{2,3})(?:\D|$)

re.findall(u'(?:\D|^)(\d{2,3})(?:\D|$)',u'11a2ee22b333c44d5e66e777e8888')

给出这个输出:

['11', '333', '66']

期望的输出:

['11', '22', '333', '44', '66', '777']

我知道有替代解决方案,例如:

filter(lambda x: re.match('^\d{2,3}$', x), re.split(u'\D',r'11a2ee22b333c44d5e66e777e8888'))

这给出了所需的输出,但我想知道第一种方法有什么问题?

好像re.findall按顺序走,匹配到就跳过前面的部分,怎么办?

最佳答案

注意:您在问题中显示的结果不是我得到的结果:

>>> import re
>>> re.findall(u'(?:\D|^)(\d{2,3})(?:\D|$)',u'11a2ee22b333c44d5e66e777e8888')
[u'11', u'22', u'44', u'66']

它仍然缺少一些您想要的匹配项,但不是相同的匹配项。

问题是即使像(?:\D|^)这样的非捕获组和 (?:\D|$)不要捕捉他们匹配的东西,他们仍然消耗它。

这意味着产生 '22' 的匹配实际消耗了:

  1. e , 与 (?:\D|^) – 未捕获(但仍被消耗)
  2. 22(\d{2,3}) – 捕获
  3. b(?:\D|$) – 未捕获(但仍被消耗)

……所以b333 之前不再可以匹配.

你可以通过后视和前视语法得到你想要的结果:

>>> re.findall(u'(?<!\d)\d{2,3}(?!\d)',u'11a2ee22b333c44d5e66e777e8888')
[u'11', u'22', u'333', u'44', u'66', u'777']

在这里,(?<!\d)是一个否定的后视,检查匹配前面没有数字,并且 (?!\d)是一个否定的前瞻,检查匹配后没有数字。至关重要的是,这些构造不会消耗任何字符串。

各种前瞻和后视结构在 Regular Expression Syntax Python 的 re 部分文档。

关于python - 匹配前面或后面没有数字的特定数量的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43214484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com