簡體   English   中英

為什么我的正則表達式中的$不匹配行尾

[英]Why doesn't $ in my regex match end of line

我有以下測試程序:

import re

class Test:
    def __init__ (self):
        self.idFiltering = True
        self.aliases = [
            ('rose', 'jasmin')
        ]

        for s in (
            '__rose__',
            'rose',

            'moon__rose',
            'rose__fish',
            'moon__rose__jelly__fish',
            'moon__rose__rose__rose__fish',

            'sun.moon.rose',
            'rose.fish',
            'rosexfish',
            'moon.rose.jelly__fish',

            'moon/rose',
            'rose/fish',
            'moon/rose/jelly__fish',

        ):   
            print (s, self.filterId (s))
        print ('done')

    def filterId (self, qualifiedId):
        if not self.idFiltering or (qualifiedId.startswith ('__') and qualifiedId.endswith ('__')):
            return qualifiedId
        else:        
            for alias in self.aliases:
                pattern = re.compile (rf'((__)|(?=[^./])){alias [0]}((__)|(?=[./$]))')

                # Replace twice to deal with overlap
                qualifiedId = pattern.sub (alias [1], qualifiedId)
                qualifiedId = pattern.sub (alias [1], qualifiedId)

            return qualifiedId

test = Test ()

我希望它會產生:

__rose__ __rose__
rose jasmin
moon__rose moon__jasmin
rose__fish jasminfish
moon__rose__jelly__fish moonjasminjelly__fish
moon__rose__rose__rose__fish moonjasminjasminjasminfish
sun.moon.rose sun.moon.jasmin
rose.fish jasmin.fish
rosexfish rosexfish
moon.rose.jelly__fish moon.jasmin.jelly__fish
moon/rose moon/jasmin
rose/fish jasmin/fish
moon/rose/jelly__fish moon/jasmin/jelly__fish
done

但是會產生:

__rose__ __rose__
rose rose
moon__rose moon__rose
rose__fish jasminfish
moon__rose__jelly__fish moonjasminjelly__fish
moon__rose__rose__rose__fish moonjasminjasminjasminfish
sun.moon.rose sun.moon.rose
rose.fish jasmin.fish
rosexfish rosexfish
moon.rose.jelly__fish moon.jasmin.jelly__fish
moon/rose moon/rose
rose/fish jasmin/fish
moon/rose/jelly__fish moon/jasmin/jelly__fish
done

換句話說,它不會取代單詞結尾處的“玫瑰”。 在我的模式中,似乎忽略了$。 我究竟做錯了什么?

[在Aran-Fey和Pushpesh Kumar Rajwanshi評論后編輯]

我已將正則表達式更改為:

rf'((__)|(?=[^./])){alias [0]}((__)|(?=[./])|$)'

現在工作正常,所以我的問題解決了。

我也嘗試過:

rf'(^|(__)|(?=[./])){alias [0]}((__)|(?=[./])|$)'

但這不起作用。 只是好奇:為什么不呢?

[EDIT2]

正如Rarblack所指出的那樣,我的解決方案只是靠運氣。 根據他/她的建議,我想我找到了正確的正則表達式:

rf'(^|(__)|(?<=[./])){alias [0]}((__)|(?=[./])|$)'

它產生預期的輸出,這次不是偶然的。

當您在[]放置特殊的正則表達式屬性時,它們將失去其含義,並像普通字符一樣工作。 這就是[./$]不起作用的原因。 同樣,將^放在方括號中意味着不要過濾其中的所有屬性: [^./]

暫無
暫無

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

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