Parantez arasında metin döndürmek için normal ifade


113
u'abcde(date=\'2/xc2/xb2\',time=\'/case/test.png\')'

Tek ihtiyacım olan parantez içindeki içerikler.


Parantez? Parantez görmüyorum. Parantez mi demek istediniz?
kzh

4
Neden çift tırnak kullanmıyorsunuz? Dizenin okunmasını kolaylaştırır, yaniu"abcde(date='2/xc2/xb2',time='/case/test.png')"
kzh

Bu soru sadece ona bakarken beni endişelendiriyor. OP'nin işlevselliği gerçekten istediğinden ve astvarlığından habersiz olduğundan şüpheleniyorum .
Kevin

Yanıtlar:


247

Sorununuz gerçekten bu kadar basitse, normal ifadeye ihtiyacınız yoktur:

s[s.find("(")+1:s.find(")")]

10
ya '(' ve ')' yoksa? s [0: -1] alacaksınız. Bu da 's': \ 'deki her şeyi alacağınız anlamına gelir. Önce dizede parantez olup olmadığını kontrol etmeniz iyi olur.
Omar

5
Ya "(bazı metinler (iç parantez içinde bazı metinler) biraz daha metin)" alırsanız?
Igor Pomaranskiy

4
O zaman sorun, asıl sorun kadar basit değildir ve farklı bir çözüm gerektirecektir.
tkerwin

1
Igor'un sorusu için: eğer bu şekilde iç içe parantezleriniz varsa, işlemin ikinci kısmı için rfind kullanırsınız. Bununla ilgili daha fazla ayrıntı için aşağıdaki yazıma bakın.
FaustoW

61

Kullanım re.search(r'\((.*?)\)',s).group(1):

>>> import re
>>> s = u'abcde(date=\'2/xc2/xb2\',time=\'/case/test.png\')'
>>> re.search(r'\((.*?)\)',s).group(1)
u"date='2/xc2/xb2',time='/case/test.png'"

45

Tüm tekrarları bulmak istiyorsanız:

>>> re.findall('\(.*?\)',s)
[u"(date='2/xc2/xb2',time='/case/test.png')", u'(eee)']

>>> re.findall('\((.*?)\)',s)
[u"date='2/xc2/xb2',time='/case/test.png'", u'eee']

aptalca bir soru olabilir, ama neden "?" gerekli mi? "(. *)" Neden çalışmıyor?
CutePoison

3
@CutePoison .*açgözlü olduğu için (en uzun maçı alacak) ve .*?açgözlü değil (en kısa maçı alacak)
dopstar

29

Eğer bir şey olursa tkerwin en Yanıta Bina olması iç içe parantez gibi

st = "sum((a+b)/(c+d))"

onun cevabı sen arasındaki her şeyi almak gerekiyorsa çalışmaz ilk açılış parantez ve son kapanış parantez almak için (a+b)/(c+d)gelen bulmak aramalar dize ayrıldığı için, ve ilk kapanış parantez dururdu.

Bunu düzeltmek rfindiçin, operasyonun ikinci kısmı için kullanmanız gerekir , böylece

st[st.find("(")+1:st.rfind(")")]

1
@ALH bu ifadede iç içe geçmiş parantez yok, cevabım bunun için iyi.
FaustoW

6
import re

fancy = u'abcde(date=\'2/xc2/xb2\',time=\'/case/test.png\')'

print re.compile( "\((.*)\)" ).search( fancy ).group( 1 )

2
contents_re = re.match(r'[^\(]*\((?P<contents>[^\(]+)\)', data)
if contents_re:
    print(contents_re.groupdict()['contents'])

Bu kod soruyu yanıtlayabilirken, sorunun nasıl ve / veya neden
çözüldüğüne
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.