2

Python で奇数回出現する文字を正規表現で置き換えることができません。

例:

char = ``...```.....``...`....`````...`

``...``````.....``...``....``````````...``

偶数オカレンスでは置き換えられません。

4

3 に答える 3

4

例えば:

>>> import re
>>> s = "`...```.....``...`....`````...`"
>>> re.sub(r'((?<!`)(``)*`(?!`))', r'\1\1', s)
'``...``````.....``...``....``````````...``'
于 2012-11-17T18:44:48.653 に答える
3

多分私は時代遅れです(または正規表現のスキルが標準に達していません)が、これは読みやすいようです:

import re

def double_odd(regex,string):
    """
    Look for groups that match the regex.  Double every second one.
    """
    count = [0]
    def _double(match):
        count[0] += 1
        return match.group(0) if count[0]%2 == 0 else match.group(0)*2
    return re.sub(regex,_double,string)

s = "`...```.....``...`....`````...`"
print double_odd('`',s)
print double_odd('`+',s)

あなたが実際に探していたものについて、私は少し混乱していたようです。コメントに基づいて、これはさらに簡単になります。

def odd_repl(match):
    """
    double a match (all of the matched text) when the length of the 
    matched text is odd
    """
    g = match.group(0)
    return g*2 if len(g)%2 == 1 else g

re.sub(regex,odd_repl,your_string) 
于 2012-11-17T18:59:04.920 に答える
0

これは解決策ほど良くないかもしれませんが、うまくregexいきます:

In [101]: s1=re.findall(r'`{1,}',char)

In [102]: s2=re.findall(r'\.{1,}',char)

In [103]: fill=s1[-1] if len(s1[-1])%2==0 else s1[-1]*2

In [104]: "".join("".join((x if len(x)%2==0 else x*2,y)) for x,y in zip(s1,s2))+fill

Out[104]: '``...``````.....``...``....``````````...``'
于 2012-11-17T19:10:26.743 に答える