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条经验 获得超8个赞
您可以使用带有捕获组的正向前瞻来获取匹配项,并使用负向后向断言直接左侧的内容不是 char az,从而开始匹配。
使用re.findall它将返回捕获组中的值。
(?<![a-z])(?=([a-z]+_[a-z]+))
解释
- (?<![a-z])否定后向查找,断言直接左边的不是 char az
- (?=正向前瞻,断言右边是什么- ([a-z]+_[a-z]+)捕获组 1,匹配 1+ 字符 az _ 1+ 字符 az
 
- )关闭前瞻
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']
 
                    
                    
                            米琪卡哇伊
                            
                                
                            
                        
                        
                                                
                    TA贡献1998条经验 获得超6个赞
文档re.findall中明确提到了这一点:
以字符串列表的形式返回字符串中模式的所有非重叠匹配项。
例如,'ash_tonic'和'tonic_transit'重叠,因此它们不会被视为两个不同的匹配项。
添加回答
举报
0/150
	提交
		取消
	