如何在正则表达式的例外中允许字符和空格?

时间:2019-04-16 02:16:50

标签: python regex unicode

输入:

  

1993年8月にデビュー。。。同年11月から1995年3月3クラシック三冠ク含むGI5连胜,10连続连対を成就し,1993年JRA赏最优秀3歳牡马[†3], 1994年JRA赏年度代表马および最优秀4歳牡马[†3]に选出された。1995年春に故障(股关节炎)を発症したあとはその后遗症から低迷し,6戦して重赏を1胜GIとどまった(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 个答案:

答案 0 :(得分:1)

您想要的输出显示在括号之前的分割,该分割不在您的正则表达式尝试中。假设这是一个错误,那么可以这样做:

#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