İlk Cümle Regex

7 Cevap php

Bazı metin dışında ilk cümle almak için bir regex (php / perl uyumlu) peşindeyim. Ben her vakayı kapsayan bu büyük alabilir fark, ama sadece şu anda "yeterince iyi" olacak bir şey sonra. Herkes bunun için raftan bir şey var mı?

7 Cevap

iyi, /^[^.]+/ basit biridir

Ne gerek, sonunda, tek başına (hatta PCRE olanları süper fişekler) düzenli ifadeler için yapmak son derece zor ve muhtemelen imkansız doğal dil ayrıştırma vardır. Bu cümleyi düşünün:

Sayın Regex ve onun cümle eşleştirme için çok fazla.

Bugüne kadar verilen her cevap iki cümle olarak bu ayrıştırmak, ve bu bir kenar durumda bile o kadar değil - ile başlayan bir metin bloğunu hayal etmek oldukça makul "Sevgili Bay Adams:" veya böyle bir şey. Sen noktalama işaretinden önce kelime ne kontrol etmek için geriye ilerleme çakmak, ancak every possible abbreviation kontrol etmek zorunda beri, unmaintainable almak için gidiyor. Sen mesela Sayın kontrol etmek ve ve co. ve Aziz ve aklınıza asla çok başka olanlar için. Bir süre sonra "oldukça iyi" pratik çözüm ile bitirmek olabilir, ama çirkin olacak, ve bir gün başarısız olur.

Bu sadece bir regex değil, ama bunu yapmak için bir Python işlevi yazdı: Separating sentences. Doğal dil işleme çok zordur, bu nedenle bu doğru tedavi etmez durumlar vardır, ancak iyi bazı zor davalarını gelmez.

Cümle "hat" ise sadece metin bir yığın gelen ilk ^.* maç. Varsayılan olarak DOT yeni çizgi karakterler eşleşmiyor.

^[^.!?]*: gerçekten ilk cümle ise, böyle bir şey yapmak

Ben sadece şu an için çalışır bir şey istiyorum biliyorum, ama this mailing list post /^[^\.]*\.\s/ ile geldi, ve subsequent post ([\s\S]+?)\.( |\r|\n) ile geldi.

Bu desenler dönemler için sadece bir maç gibi görünüyor olsa da bu tür ünlem işaretleri ve soru işaretleri gibi noktalama diğer türleri için maç değiştirmek istiyorsanız, bu size kalmış.

/\A(.+?)[.?!] /s

boşluk ve ardından bu noktalama işaretleri biri kadar her şeyi eşleşir. O, ne cümle değildir değil mi? Nokta yeni hatlar aynı olmalıdır

. Bu NET'te çalışır:

/(?<=^\s*)(?!\s)("(\<'.*?'\>|.)*"|.)*?((?<='*"*)|[.?!]+|$)(?=\ \ |\n\n|$)/s

Tırnak işaretleri (Amerikan tarzı) Kolları (ve tırnak "böyle" ve bu. "Evet, noktalama ile.") Ve çoklu noktalanmaların ile biten cümleler. Ayrıca boşluk önceki sayar. Ama iki boşluk veya iki-sonu çizgiler veya ve son dosya-cümle sonra gerektirir.

Aşağıdaki iyi Kolları:

Diyor gibi, Sayın Regex ve onun cümle eşleştirme için çok "bu cümle, harika? Biri değil 'Bu örnekte için tamamen hazırlanmış oldu Sanki bulunuyor' diyor." Bu bir parçası olsa da, aynı olmamalıdır.