Как разрешить символы и пробелы в исключении в регулярных выражениях? - PullRequest
3 голосов
/ 16 апреля 2019

С учетом ввода:

1993 三 8 同年 デ ュ ー 。。。 同年 月 月 月 ら ら ら ら ら ら ら ら ら ら ら ら ら ら 、 、 † † 3 1994 年 RA 年度 代表 馬 お よ 最 優秀 優秀 4 優秀 優秀 † [† 3]。 選出 さ れ た。。 1995 年 春 に 故障 (股 関節炎)す る に と ど ま っ た (GI は 5 戦 し て 未 勝利) が, 第 44 回 阪神 大 賞 典 に お け る マ ヤ ノ ト ッ プ ガ ン と の マ ッ チ レ ー ス や 短 距離 戦 で あ る 第 26 回 高 松 宮 杯 へ の 出走 に よ っ て フ ァ ン の 話題 を 集 め た.第 26 回 高 松 宮 杯 出走 後 に 発 症 し た 屈 腱 炎 が 原因 と な っ て 1996 年 10 月 に 競走 馬 を 引退 し た. 競走 馬 を 引退 し た あ と は 種 牡 馬 と な っ た が, 1998 年 9 月 に 胃 破裂 を 発 症し, 安 楽 死 の 措置 が と ら れ た.

Желаемый результат:

["1993年8月にデビュー。"
 "同年11月から1995年3月にかけてクラシック三冠を含むGI5連勝、", "10連続連対を達成し、",
 "1993年JRA賞最優秀3歳牡馬[† 3]、", "1994年JRA賞年度代表馬および最優秀4歳牡馬[† 3]に選出された。",
 "1995年春に故障(股関節炎)を発症したあとはその後遺症から低迷し、", "6戦して重賞を1勝するにとどまった",
 "(GI は5戦して未勝利)が、", "第44回阪神大賞典におけるマヤノトップガンとのマッチレースや短距離戦である第26回高松宮杯への出走によってファンの話題を集めた。",
 "第26回高松宮杯出走後に発症した屈腱炎が原因となって1996年10月に競走馬を引退した。",
 "競走馬を引退したあとは種牡馬となったが、", "1998年9月に胃破裂を発症し、", "安楽死の措置がとられた。"]

Я пробовал следующее регулярное выражение:

import re

text= str("1993年8月にデビュー。"
          "同年11月から1995年3月にかけてクラシック三冠を含むGI5連勝、10連続連対を達成し、"
          "1993年JRA賞最優秀3歳牡馬[† 3]、1994年JRA賞年度代表馬および最優秀4歳牡馬[† 3]に選出された。"
          "1995年春に故障(股関節炎)を発症したあとはその後遺症から低迷し、6戦して重賞を1勝するにとどまった"
          "(GI は5戦して未勝利)が、第44回阪神大賞典におけるマヤノトップガンとのマッチレースや短距離戦である第26回高松宮杯への出走によってファンの話題を集めた。"
          "第26回高松宮杯出走後に発症した屈腱炎が原因となって1996年10月に競走馬を引退した。"
          "競走馬を引退したあとは種牡馬となったが、1998年9月に胃破裂を発症し、安楽死の措置がとられた。")

re.split(r'([^! ? 。、]*[!?。、]{1,3})', text)

Правильно разбивает знаки пунктуации, а также разделяет пробел, выводит:

['',
 '1993年8月にデビュー。',
 '',
 '同年11月から1995年3月にかけてクラシック三冠を含むGI5連勝、',
 '',
 '10連続連対を達成し、',
 '1993年JRA賞最優秀3歳牡馬[† ',
 '3]、',
 '1994年JRA賞年度代表馬および最優秀4歳牡馬[† ',
 '3]に選出された。',
 '',
 '1995年春に故障(股関節炎)を発症したあとはその後遺症から低迷し、',
 '6戦して重賞を1勝するにとどまった(GI ',
 'は5戦して未勝利)が、',
 '',
 '第44回阪神大賞典におけるマヤノトップガンとのマッチレースや短距離戦である第26回高松宮杯への出走によってファンの話題を集めた。',
 '',
 '第26回高松宮杯出走後に発症した屈腱炎が原因となって1996年10月に競走馬を引退した。',
 '',
 '競走馬を引退したあとは種牡馬となったが、',
 '',
 '1998年9月に胃破裂を発症し、',
 '',
 '安楽死の措置がとられた。',
 '']

Эти сегменты были неправильно разбиты, потому что пробел не был включен в разрешенные символы первой необязательной группы:

'1993年JRA賞最優秀3歳牡馬[† 3]、',
'1994年JRA賞年度代表馬および最優秀4歳牡馬[† 3]に選出された。',
...,
'6戦して重賞を1勝するにとどまった(GI は5戦して未勝利)が、'

Как разрешить символы и пробелы в исключении в регулярном выражении?

1 Ответ

1 голос
/ 16 апреля 2019

Ваш желаемый результат показывает разделение перед круглой скобкой, которого не было в вашей попытке регулярного выражения. Предполагая, что это ошибка, это работает:

#coding:utf8
import re
text = '''1993年8月にデビュー。。。同年11月から1995年3月にかけてクラシック三冠を含むGI5連勝、10連続連対を達成し、1993年JRA賞最優秀3歳牡馬[† 3]、1994年JRA賞年度代表馬および最優秀4歳牡馬[† 3]に選出された。1995年春に故障(股関節炎)を発症したあとはその後遺症から低迷し、6戦して重賞を1勝するにとどまった(GI は5戦して未勝利)が、第44回阪神大賞典におけるマヤノトップガンとのマッチレースや短距離戦である第26回高松宮杯への出走によってファンの話題を集めた。第26回高松宮杯出走後に発症した屈腱炎が原因となって1996年10月に競走馬を引退した。競走馬を引退したあとは種牡馬となったが、1998年9月に胃破裂を発症し、安楽死の措置がとられた。'''

desired = ["1993年8月にデビュー。",
           "同年11月から1995年3月にかけてクラシック三冠を含むGI5連勝、",
           "10連続連対を達成し、",
           "1993年JRA賞最優秀3歳牡馬[† 3]、",
           "1994年JRA賞年度代表馬および最優秀4歳牡馬[† 3]に選出された。",
           "1995年春に故障(股関節炎)を発症したあとはその後遺症から低迷し、",
           "6戦して重賞を1勝するにとどまった(GI は5戦して未勝利)が、",
           "第44回阪神大賞典におけるマヤノトップガンとのマッチレースや短距離戦である第26回高松宮杯への出走によってファンの話題を集めた。",
           "第26回高松宮杯出走後に発症した屈腱炎が原因となって1996年10月に競走馬を引退した。",
           "競走馬を引退したあとは種牡馬となったが、",
           "1998年9月に胃破裂を発症し、",
           "安楽死の措置がとられた。"]

actual = re.findall(r'([^!?。、]*[!?。、])[!?。、]*', text)
print(desired == actual)

Выход:

True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...