2012-12-28 29 views
0

我寫這個表達式(在Python 3):(?<![\u0410-\u042F])([.!?])(?=(\s)?(\s)?[\u0410-\u042F]|[\u04E8]|["]|[\u201C]|![0-9])正則表達式拆分不止一次

我使用Python的re.split()

它拆分句子西里爾。他們被\n分開。所以它應該拆分此:

Мамлекеттик айыптоочу Биринчи май райондук сотуна берген бул сунушун диний кастыкты ырбатпоо аракети менен негиздеди. Мусулмандарга акаарат келтирип жатат деген кайрылуу каттын негизинде УКМК Тезекбаевге каршы кылмыш ишин козгоп, сотко өткөргөн. Бул ишти бүгүн Биринчи май райондук соту карап бүттү жана өкүм эртең чыгарыларын маалымдады. 

分離的句子:

Мамлекеттик айыптоочу Биринчи май райондук сотуна берген бул сунушун диний кастыкты ырбатпоо аракети менен негиздеди. 
Мусулмандарга акаарат келтирип жатат деген кайрылуу каттын негизинде УКМК Тезекбаевге каршы кылмыш ишин козгоп, сотко өткөргөн. 
Бул ишти бүгүн Биринчи май райондук соту карап бүттү жана өкүм эртең чыгарыларын маалымдады. 

但出於某種原因期間(最後一個字符)放在一個新行!除了最後一個。

我看到他們說不要把"()"[.!?],但如果我這樣做,那麼標點符號被刪除。

+0

想必你也分別在結果列表中打印每個元素,或者您正在使用'\ n'.join()',是否正確? –

回答

2

最簡單的方法是重新連接捕捉punctiation早在列表前面的元素到:

example = 'Мамлекеттик айыптоочу Биринчи май райондук сотуна берген бул сунушун диний кастыкты ырбатпоо аракети менен негиздеди. Мусулмандарга акаарат келтирип жатат деген кайрылуу каттын негизинде УКМК Тезекбаевге каршы кылмыш ишин козгоп, сотко өткөргөн. Бул ишти бүгүн Биринчи май райондук соту карап бүттү жана өкүм эртең чыгарыларын маалымдады.' 

def reattach(sentences): 
    punctuation = ('.', '!', '?') 
    previous = '' 
    for sentence in sentences: 
     if sentence not in punctuation: 
      previous = sentence 
     else: 
      yield previous + sentence 
      previous = '' 
    if previous: 
     yield previous 

punctuation = re.compile('(?<![\u0410-\u042F])([.!?])(?=(\s)?(\s)?[\u0410-\u042F]|[\u04E8]|["]|[\u201C]|![0-9])') 
for sentence in reattach(punctuation.split(example)): 
    print(sentence) 

運行在你的榜樣輸入這個方法給我:

Мамлекеттик айыптоочу Биринчи май райондук сотуна берген бул сунушун диний кастыкты ырбатпоо аракети менен негиздеди. 
Мусулмандарга акаарат келтирип жатат деген кайрылуу каттын негизинде УКМК Тезекбаевге каршы кылмыш ишин козгоп, сотко өткөргөн. 
Бул ишти бүгүн Биринчи май райондук соту карап бүттү жана өкүм эртең чыгарыларын маалымдады. 
+0

這裏有一個錯誤:'在重新附加(punctuation.split(input))中的句子:'TypeError:期望的字符串或緩衝區 –

+0

另外,爲什麼re.compile()而不是re.split()? –

+0

你的情況下輸入是什麼?我用Python 3.3測試了這個,其中'input'是一個'str'。顯式的'compile'可以使事情變得更快一些,否則與使用're.split()'沒有區別。 –