2016-03-24 17 views
2

Perl'de, bir oyuncu değişikliği yapmak ve aynı zamanda bir grup maçı yapmak benim için mümkün. Örneğin.Python'da re.sub'taki Grup Maçı alın

my $string = "abcdef123"; 
$string =~ s/(\d+)//; 
my $groupMatched = $1; # $groupMatched is 123 

Python'da, aşağıdaki gibi re.sub işlevini kullanarak ikameyi yapabilirim. Ancak, başka bir işlev re.match çağırmadan ve ek bir işlem yapmadan \ d + grup eşleşmesini yakalamanın bir yolunu bulamıyorum.

string = "abcdef123" 
string = re.sub("(\d+)", "", string) 

herkes aynı re.sub operasyonundan ayrı değişken olarak "\ d +" eşleşti değerini yakalamak nasıl biliyor mu? Aşağıdaki komutu denedim ve işe yaramıyor.

print r'\1' 
+1

Bunun mümkün olup olmadığından emin değilim (en azından aynı zamanda) çünkü "re.sub" öğesinin dönüş nesnesi bir dizedir. Eğer böyle bir şey varsa, rx_obj = re.search ('123 $', another_string) ', rx_obj.group()' ile yakalanabilen bir RE nesnesi alırsınız. – maxie

+0

Sanırım ikisinin de aynı anda yapılması mümkün değil. Diğer yollar biraz hackish ya da temelde iki ayrı adım gibi görünüyor. – KT8

+1

Perl'de, özel numaralı değişkenleri kullanmadan önce eşleşmenin başarılı olup olmadığını her zaman doğrulamanız gerektiğini unutmayın: eğer if ($ str = ~ s/(\ d +) //) {$ x = $ 1; } ' – stevieb

cevap

1

Aşağıdaki yapabilirsiniz:

sub_str = re.search("(\d+)", str).group(1) 

"123" bölümünü bulacak.

Sonra değiştirin: Eğer daha fazla varsa [0-9] dizisi Eğer findall kullanabilir ve tüm maçları elle yineleme gerekeceğini

str = str.replace(sub_str, "") 

Not.

+0

Bu yanıt yanlış ya da en azından çok genel değil - bir dize olarak 'sub_str' bulmanın, orijinal deseni normal bir ifade olarak bulmakla aynı olduğunu varsayamazsınız. Örneğin, eğer desen "r" foo (?! Bar) "ise," foobarfoo "ile eşleşecektir, sadece pozisyon 6'dadır, fakat eşleştirilen dizi" foo "' 0 ve 6 pozisyonlarında görünür. –

4

Hile ve re.sub bir fonksiyon geçirebilirsiniz: kodunun altına

results = [] 
def capture_and_kill(match): 
    results.append(match) 
    return "" 
string = "abcdef123" 
string = re.sub("(\d+)", capture_and_kill, string) 
results[0].group(1) 
# => '123' 
0

piton 3.6 altında test edilmiştir.

test = "abcdef123" 
resp = re.sub(r'\w+[A-Za-z](\d+)',r'\1',test) 
print (resp) 

123 
+0

Soruyu yanıtlamıyor - sadece '\ 1' ile aynı dizgiyi döndürüyorsunuz çünkü yedek modeliniz 'r' \ 1''dir. –