簡體   English   中英

我應該匹配某個模式重復項和一個可選模式的Python正則表達式在做什么?

[英]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_123label組沒有為repeat_num

和我期待的第二串s2匹配abc_123label的群體和“1” repeat_num

在兩種情況下,實際結果均以abc停止。

似乎部分是由於[^_]位所致,該位匹配“除下划線外的任何字符”。

我無法立即找到一種能夠正確捕獲這些令牌的解決方案; 我強烈建議您使用RegExr來處理您的正則表達式,以便弄清楚如何正確匹配各個部分。

您的模式與abc123輸入字符串之間的_不匹配。 您需要修改第一個捕獲組才能處理這些捕獲組。

但是直接翻譯可能會遇到困難,因為將最后一個_r1塊與正常的額外塊(如_123區分開來有點困難。 我認為下面的模式可以正確執行此操作,但是您應該仔細檢查它是否始終符合您的期望:

(?P<label>[^_]+(?:_[^_]+)*?)(?:_r(?P<repeat_num>\d+))?

如果您始終在文本的第一部分中至少需要兩個帶下划線的分隔成組(例如abc_123 ,但絕不只是abc123本身),則應替換*? +?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM