python3正则表达式匹配但不包括最后一个字符_使用python正则表达式查找最后一个匹配项...

我不确定你原来的正则表达式是否能满足你的要求。

很抱歉我来晚了。但其他人可能也会觉得这很有用。import re

p = r"AAAA(?=\s\w+)" #revised per comment from @Jerry

p2 =r"\w+ AAAA \w+"

s = "foo bar AAAA foo2 AAAA bar2"

l = re.findall(p, s)

l2 = re.findall(p2, s)

print('l: {l}'.format(l=l))

#print(f'l: {l}') is nicer, but online interpreters sometimes don't support it.

# https://www.onlinegdb.com/online_python_interpreter

#I'm using Python 3.

print('l2: {l}'.format(l=l2))

for m in re.finditer(p, s):

print(m.span())

#A span of (n,m) would really represent characters n to m-1 with zero based index

#So.(8,12):

# => (8,11: 0 based index)

# => (9th to 12th characters conventional 1 based index)

print(re.findall(p, s)[-1])

输出:l: ['AAAA', 'AAAA']

l2: ['bar AAAA foo2']

(8, 12)

(18, 22)

AAAA

这里得到两个结果而不是原来的结果的原因是(?=)特殊的调味汁。

它被称为“积极展望”。

当在regex求值过程中找到匹配项时,它不会“使用”(即向前移动光标)。所以,匹配后就回来了。

尽管正的lookahead在括号中,但它们也充当一个非捕获组。

因此,尽管模式是匹配的,但结果忽略了由\w+和中间空格\s表示的字母数字字符的周围序列——表示[ \t\n\r\f\v]。(更多here)

所以我每次都只回AAAA。

p2这里,代表了@SDD代码的原始模式,提出问题的人。

foo2使用了该模式,因此当regex引擎重新开始其第二次匹配迭代时,第二个AAAA将不匹配,因为光标前进得太远。

如果你想更深入地挖掘,我建议看一下Moondra的Youtube视频。

他对Python正则表达式做了一个非常全面的17部分系列,从here开始

这是一个在线Python解释器的link。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值