[英]What am I doing wrong with this Python regex that is supposed to match repeats of a pattern, followed by an optional pattern?
這是我正在嘗試的:
import re
r = re.compile(r'(?P<label>(?:[^_]+)+)(_r(?P<repeat_num>\d+))?')
def main():
s1 = 'abc_123'
s2 = 'abc_123_r1'
m1 = r.match(s1)
m2 = r.match(s2)
print(m1.groups())
print(m2.groups())
if __name__ == "__main__":
main()
我期待第一串s1
匹配abc_123
的label
組沒有為repeat_num
。
和我期待的第二串s2
匹配abc_123
為label
的群體和“1” repeat_num
。
在兩種情況下,實際結果均以abc
停止。
似乎部分是由於[^_]
位所致,該位匹配“除下划線外的任何字符”。
我無法立即找到一種能夠正確捕獲這些令牌的解決方案; 我強烈建議您使用RegExr來處理您的正則表達式,以便弄清楚如何正確匹配各個部分。
您的模式與abc
和123
輸入字符串之間的_
不匹配。 您需要修改第一個捕獲組才能處理這些捕獲組。
但是直接翻譯可能會遇到困難,因為將最后一個_r1
塊與正常的額外塊(如_123
區分開來有點困難。 我認為下面的模式可以正確執行此操作,但是您應該仔細檢查它是否始終符合您的期望:
(?P<label>[^_]+(?:_[^_]+)*?)(?:_r(?P<repeat_num>\d+))?
如果您始終在文本的第一部分中至少需要兩個帶下划線的分隔成組(例如abc_123
,但絕不只是abc
或123
本身),則應替換*?
用+?
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.