为了账号安全,请及时绑定邮箱和手机立即绑定

如果字符串已经匹配,正则表达式是否会省略字符串的一部分?

如果字符串已经匹配,正则表达式是否会省略字符串的一部分?

哔哔one 2024-01-16 15:14:57
Python 3.8.2 手头的任务很简单:匹配由单个下划线分隔的小写字符。所以模式可以是r"[a-z]+_[a-z]+"现在我的问题是我希望re.findall()将以下所有内容配对:“ash_tonic_transit_so_kern_err_looo_”我没有将每个下划线周围的所有单词('ash_tonic','tonic_transit','transit_so'等)配对,而是得到三对:['ash_tonic','transit_so','kern_err']一旦找到匹配项,python 是否会重新省略部分字符串,而不是再次运行搜索?import redef match_lower(s):    patternRegex = re.compile(r'[a-z]+_[a-z]+')    mo =  patternRegex.findall(s)    return moprint(match_lower('ash_tonic_transit_so_kern_err_looo_'))
查看完整描述

2 回答

?
慕仙森

TA贡献1827条经验 获得超7个赞

您可以使用带有捕获组的正向前瞻来获取匹配项,并使用负向后向断言直接左侧的内容不是 char az,从而开始匹配。

使用re.findall它将返回捕获组中的值。

(?<![a-z])(?=([a-z]+_[a-z]+))

解释

  • (?<![a-z])否定后向查找,断言直接左边的不是 char az

  • (?=正向前瞻,断言右边是什么

    • ([a-z]+_[a-z]+)捕获组 1,匹配 1+ 字符 az _ 1+ 字符 az

  • )关闭前瞻

正则表达式演示Python演示

import re

 

regex = r"(?<![a-z])(?=([a-z]+_[a-z]+))"     

test_str = "ash_tonic_transit_so_kern_err_looo_"     

print(re.findall(regex, test_str))

输出


['ash_tonic', 'tonic_transit', 'transit_so', 'so_kern', 'kern_err', 'err_looo']


查看完整回答
反对 回复 2024-01-16
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

文档re.findall中明确提到了这一点:

以字符串列表的形式返回字符串中模式的所有非重叠匹配项。

例如,'ash_tonic''tonic_transit'重叠,因此它们不会被视为两个不同的匹配项。


查看完整回答
反对 回复 2024-01-16
  • 2 回答
  • 0 关注
  • 43 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信