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
提交
取消