簡體   English   中英

如何在Python中使用帶有命名組的正則表達式子模式?

[英]How can I use a regex subpattern with a named group in Python?

我正在將一個正則表達式的腳本從Perl翻譯成Python,我遇到了正則表達式子模式的問題。

在Perl中,如果我按預期編寫以下工作,即寫入字符串“OK”。 我從來沒有多想過,但它看起來像Perl知道那些是不同的組,雖然他們有相同的名字。

my $ident  = qr{ (?<guill> ['"`]? ) [a-zA-Z_] \w* \g{guill} }x;
my $idents = qr{ (?: $ident \s* , \s* )* $ident }x;
my $test   =  q{'test', "test"};

if ($test =~ $idents) {
    say 'OK';
}

我發現除了在編譯為正則表達式模式之前將字符串置於字符串之外,我沒有辦法在Python中的模式中插入子模式,所以我將我的Perl代碼翻譯為:

ident  = r"(?P<guill> ['\"`]? ) [a-zA-Z_] \w* (P=guill)"
idents = r"(?: " + ident + r" \s* , \s* )* " + ident
test   = "'test', \"test\""

if re.match( idents, test, re.VERBOSE ):
    print "OK"

不出所料,這甚至都沒有編譯,因為Python抱怨“將組名重新定義為'guill'為第3組”。 我試圖Perlish的方式re.compile倒是ident ,但隨后拒絕連接具有一個模式對象的字符串。

Python的實現方式是什么?

這可以使用真正的正則表達式來完成。

ident0 = r"[a-zA-Z_] \w*"
ident1 = r"' [a-zA-Z_] \w* '"
ident2 = r"\" [a-zA-Z_] \w* \""
ident3 = r"` [a-zA-Z_] \w* `"
ident  = "(?:" + ident0 + "|" + ident1 + "|" + ident2 + "|" + ident3 + ")"

與@ ikegami的答案幾乎相同,但沒有identN名稱(通常表明列表是更好的選擇),以及更多Pythonic '|'.join

subidents = [
    r"[a-zA-Z_] \w*",
    r"'[a-zA-Z_] \w* '",
    r"\"[a-zA-Z_] \w* \"",
    r"`[a-zA-Z_] \w* `",
    ]
ident = "(?:%s)" % '|'.join(subidents)

現在,您可以將您的子事件列表擴展為更多。

專業提示:當您可能在以后添加更多項目時,在最后一個列表項目后添加一個尾隨逗號 - 在比較版本時減少多余的更改行。

暫無
暫無

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

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