2016-04-13 29 views
2

, her satırı iki ifadeler vardır ve ne Almak istediğim kelimeleri ayırmak için _ eklemektir "\t"Dizeleri bazı kurallara göre nasıl değiştiririm? Aşağıdaki metinleri var

RoadTunnel RouteOfTransportation 
LaunchPad Infrastructure 
CyclingLeague SportsLeague 
Territory PopulatedPlace 
CurlingLeague SportsLeague 
GatedCommunity PopulatedPlace 

ile ayrılmış, sonuç olmalıdır:

Road_Tunnel Route_Of_Transportation 
Launch_Pad Infrastructure 
Cycling_League Sports_League 
Territory Populated_Place 
Curling_League Sports_League 
Gated_Community Populated_Place 

yoktur "ABTest" veya "aBTest" gibi bir durum yok ve üç kelime birlikte "RouteOfTransportation" gibi çeşitli durumlar denedim ama başarılı olmadı.

textProcessed = re.sub(r"([A-Z][a-z]+)(?=([A-Z][a-z]+))", r"\1_", text) 

Ancak hiçbir sonuç

+4

Sizin için bazı kodlar yazmamızı istiyor gibisiniz. Birçok kullanıcı sıkıntıda bir kodlayıcı için kod üretmeye istekli olsa da, genellikle yalnızca posterin sorunu kendi başlarına çözmeye çalıştığı zaman yardımcı olurlar. Bu çabayı göstermenin iyi bir yolu, şimdiye kadar yazdığınız kodu, örnek girişi (varsa), beklenen çıktıyı ve aldığınız çıktıyı (konsol çıkışı, geri izleme vb.) Dahil etmektir. Sağladığınız daha fazla ayrıntı, daha fazla yanıt almanızı sağlar. [FAQ] ve [ask] 'ı kontrol edin. –

+1

Btw. Bence ek test davaları iyi olurdu. HTTPResponse veya CSV ne dönüştürülmeli? –

+0

Önerileriniz için teşekkürler, @Rogalski, kodları soruma koymalıydım. Bir dahaki sefere dikkat edeceğim. – flyingmouse

cevap

4

kullanın normal bir ifade ve re.sub vardır: benim denemeden

Bir.

>>> import re 
>>> s = '''LaunchPad Infrastructure 
... CyclingLeague SportsLeague 
... Territory PopulatedPlace 
... CurlingLeague SportsLeague 
... GatedCommunity PopulatedPlace''' 
>>> subbed = re.sub('([A-Z][a-z]+)([A-Z])', r'\1_\2', s) 
>>> print(subbed) 
Launch_Pad Infrastructure 
Cycling_League Sports_League 
Territory Populated_Place 
Curling_League Sports_League 
Gated_Community Populated_Place 

düzenleme: bağlı

>>> "_".join(re.findall(r"[A-Z]{1}[^A-Z]*", text)) 
+0

Ben ([A-Z] [a-z] +) 'yi ([a-zA-Z]) ile değiştiririm, böylece" BThing "gibi desenler çalışır. "ABThing" gibi kalıpları desteklemeyeceğini unutmayın. –

+0

@QuentinRoy Evet, şu anda "BThing" için tasarlanan davranışın ne olacağını bile bilmiyoruz. OP bir kelime "BT" düşünüyor mu? Her neyse, yorum için, OP'nin gerçek özelliklerini temel alarak, şimdi doğru regex'i seçebilir veya kendi başına ayarlayabilirsiniz. – timgeb

+0

@timgeb, muğlaklık için üzgünüm, sorumu değiştirdim – flyingmouse

2

re.findall ve str.join birleştiren: En test durumları tam olarak ne istediğini emin olmak için yeterince örtmeyen beri Burada başka biri var ihtiyaçlarınız için biraz farklı bir çözüm şu olabilir:

import re 
result = re.sub(r"([a-zA-Z])(?=[A-Z])", r"\1_", s) 

_, başka bir harfi (büyük veya küçük harf olup olmadığını) takip eden büyük harflerin önüne eklenecektir.

  • "TheRabbit IsBlue" =>"The_Rabbit Is_Blue"
  • "ABThing ThingAB" =>"A_B_Thing Thing_A_B"

Bu özel karakter desteklemez.

2

:

>>> re.sub('([a-zA-Z])([A-Z])([a-z])', r'\1_\2\3', 'ABThingThing') 
'AB_Thing_Thing' 
İlgili konular