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

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 re

def match_lower(s):

    patternRegex = re.compile(r'[a-z]+_[a-z]+')

    mo =  patternRegex.findall(s)

    return mo




print(match_lower('ash_tonic_transit_so_kern_err_looo_'))


哔哔one
浏览 48回答 2
2回答

慕仙森

您可以使用带有捕获组的正向前瞻来获取匹配项,并使用负向后向断言直接左侧的内容不是 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']

米琪卡哇伊

文档re.findall中明确提到了这一点:以字符串列表的形式返回字符串中模式的所有非重叠匹配项。例如,'ash_tonic'和'tonic_transit'重叠,因此它们不会被视为两个不同的匹配项。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python