Python igen.sub spørgsmål

Hilsner alle,

Jeg er ikke sikker på, om dette er muligt, men jeg vil gerne bruge matchede grupper i et regulært substitution til at ringe variabler.

a = 'foo'
b = 'bar'

text = 'find a replacement for me [[:a:]] and [[:b:]]'

desired_output = 'find a replacement for me foo and bar'

re.sub('\[\[:(.+):\]\]',group(1),text) #is not valid
re.sub('\[\[:(.+):\]\]','\1',text) #replaces the value with 'a' or 'b', not var value

tanker?

ha! ikke rigtig. bekendt med py,perl og php – master of none. tak for din hjælp 🙂

OriginalForfatteren netricate | 2010-01-19

3 svar

  1. 26

    Du kan angive en tilbagekaldsanmodning når du bruger igen.sub, som har adgang til grupper:
    http://docs.python.org/library/re.html#text-munging

    a = 'foo'
    b = 'bar'
    
    text = 'find a replacement for me [[:a:]] and [[:b:]]'
    
    desired_output = 'find a replacement for me foo and bar'
    
    def repl(m):
        contents = m.group(1)
        if contents == 'a':
            return a
        if contents == 'b':
            return b
    
    print re.sub('\[\[:(.+?):\]\]', repl, text)

    Også mærke den ekstra ? i regulære udtryk. Du ønsker ikke-grådige matchende her.

    Jeg forstår, det er bare prøve kode for at illustrere et begreb, men for eksempel, du gav, enkel streng formatering er bedre.

    tak for koden! dette er faktisk tættere på, hvad jeg tænkte.
    Jeg svarede på dit spørgsmål, men jeg tror, du var stille de forkerte spørgsmål. Når det er relevant, bedes du Venligst bruge string formatering i stedet for regulære udtryk. Noufal Ibrahim besvaret de spørgsmål, du skulle have bedt om.
    Glem ikke anførselstegn i return-sætninger. 🙂

    OriginalForfatteren Christian Oudard

  2. 8

    Lyder som overkill. Hvorfor ikke bare gøre noget, som

    text = "find a replacement for me %(a)s and %(b)s"%dict(a='foo', b='bar')

    ?

    tekst, der er gemt i DB. Jeg tror, jeg vil kunne erstatte alle de [[::]] værdier med %() værdier, og det bør arbejde. Jeg vil give det en chance. Tak!
    denne metode afhænger af, om du kender placeringen af [[:en:]] og [[:b:]].
    Der er masser af spørgsmål, men hvad den OP og forsøger at gøre, er konceptuelt er det samme som streng formatering.

    OriginalForfatteren Noufal Ibrahim

  3. 2
    >>> d={}                                                
    >>> d['a'] = 'foo'                                      
    >>> d['b'] = 'bar' 
    >>> text = 'find a replacement for me [[:a:]] and [[:b:]]'
    >>> t=text.split(":]]")
    >>> for n,item in enumerate(t):
    ...   if "[[:" in item:
    ...      t[n]=item[: item.rindex("[[:") +3 ] + d[ item.split("[[:")[-1]]
    ...
    >>> print ':]]'.join( t )
    'find a replacement for me [[:foo:]] and [[:bar:]]'
    tak for endnu et kig på denne. meget cool! 🙂

    OriginalForfatteren ghostdog74

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *