Düzenli ifadeye dayalı Python bölünmüş dize


115

Bir dizeyi "HELLO there HOW are YOU"büyük harflerle (Python'da) bölmenin en iyi yolu nedir ?

Yani şöyle bir dizi ile sonuçlanırdım: results = ['HELLO there', 'HOW are', 'YOU']


DÜZENLE:

Denedim:

p = re.compile("\b[A-Z]{2,}\b")
print p.split(page_text)

Yine de işe yaramıyor gibi görünüyor.


2
Ne denedi ? - Bulamadın re.split()mı?
Gareth Latty

5
Bir şeyin işe yaramadığını söylediğinde, nedenini açıklamalısın. Bir istisna mı yapıyorsun? (Öyleyse, istisnanın tamamını gönderin) Yanlış çıktı mı alıyorsunuz?
Gareth Latty

Yanıtlar:


134

öneririm

l = re.compile("(?<!^)\s+(?=[A-Z])(?!.\s)").split(s)

Bu demoyu kontrol edin .


5
derlemeyi kullanmadığınızda ne olur?
Feelsbadman

3
Başına yeniden docs , " en düzenli ifade işlemleri fonksiyonları ilk regex nesnesi derlemeye gerekmez kısayollarıdır. Modül düzeyinde işlevleri ve RegexObject yöntemleri gibi kullanılabilir, ancak bir miktar ince ayar parametrelerini özlüyorum. " Kullanabilirsiniz re.split(re.split(pattern, string, maxsplit=0, flags=0))daha önce alıntı yapılan belgelerde bahsedildiği gibi.
ZaydH

57

Bir bakış açısı kullanabilirsiniz:

re.split(r'[ ](?=[A-Z]+\b)', input)

Bu, her boşlukta bölünür ve ardından bir kelime sınırı ile biten bir büyük harf dizisi gelir.

Köşeli parantezlerin yalnızca okunabilirlik için olduğunu ve göz ardı edilebileceğini unutmayın.

Bir kelimenin ilk harfinin büyük olması yeterliyse (yani önüne de bölmek isterseniz Hello) daha da kolaylaşır:

re.split(r'[ ](?=[A-Z])', input)

Şimdi bu, her boşlukta bölünür ve ardından herhangi bir büyük harf gelir.


1
re.split(r'[ ](?=[A-Z]+\b)', input)Büyük harf bulmaması için nasıl değiştirirdim ? Örneğin "A" ile eşleşmez mi? Denedim re.split(r'[ ](?=[A-Z]{2,}+\b)', input). Teşekkürler!

@JamesEggers En az iki büyük harf kullanmak istediğinizi mi kastediyorsunuz, böylece I? re.split(r'[ ](?=[A-Z]{2,}\b)', input)yapmalı.
Martin Ender

2
En azından [ ]+ya da belki \W+biraz daha fazla dava yakalamayı öneririm . Yine de iyi bir cevap.
georg

Aynı yaklaşımı denedim. Ancak, bir sahip olmak [ ]benim için işe yaramadı. Bunun yerine kullandım \s. Benim için işe re.split("\s(?=[A-Z]+\s)", string)
yarayan

0

Sorunuz dize değişmezi içeriyor "\b[A-Z]{2,}\b", ancak bu \bgeri alacağı anlamına gelecektir, çünkü r-değiştiricisi yoktur.

Deneyin: r"\b[A-Z]{2,}\b".

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.