首页 > 解决方案 > 范围中文字符和选定字符组的正则表达式

问题描述

我正在尝试从带有 [NAME] 和 [PLACE] 等附加字符组的字符串中获取所有中文句子。

我有这个字符串

<DisplayName>凡人战争</DisplayName>
<Desc>[NAME]赶到[PLACE],发现战火正燃,此地百姓饱受战争之苦。&lt;/Desc>
<Display>劝停战争</Display>  
<OKResult><![CDATA[me:AddMsg(XT("[NAME]以仙法摄走两军首领,一番劝戒,迫使他们停止了战争 ...

我想找到

凡人战争
[NAME]赶到[PLACE],发现战火正燃,此地百姓饱受战争之苦
[NAME]以仙法摄走两军首领,一番劝戒,迫使他们停止了战争,消弭了这场祸事
此举手段温和,虽无人知晓,但却顺应天道,[NAME]获得了一些功德

我知道中文字符正则表达式是[\u4e00-\u9fff\uFF0C]+ 和组字符(\u005BNAME\u005D)(\u005BPLACE\u005D)但是如何结合它。

我尝试用python编写这种方式

Array_of_words = re.findall(r'[\u4e00-\u9fff\uFF0C(\u005BNAME\u005D)(\u005BPLACE\u005D)]+', text)

但另外标记单个字母和括号,如下所示:

['N', 'N', '凡人战争', 'N', '[NAME]赶到[PLACE],发现战火正燃,此地百姓饱受战争之苦', '劝停战争', '[C', 'A', 'A[', 'A', 'M', '(', '(', '[NAME]以仙法摄走两军首领,一番劝戒,迫使他们停止了战争,消弭了这场祸事', '此举手段温和,虽无人知晓,但却顺应天道,[NAME]获得了一些功德', '))', 'A', 'P', '(', '(', '))', '()', ']]']

标签: pythonregex

解决方案


您可以使用

re.findall(r'(?:\[(?:PLACE|NAME)]|[\u4e00-\u9fff\uFF0C])+', text)

细节

  • (?:- 非捕获组的开始:
    • \[(?:PLACE|NAME)]- [, 然后 要么PLACE要么NAME然后]
    • |- 或者
    • [\u4e00-\u9fff\uFF0C]- 你的一个中国字符模式
  • )+- 组的结尾,匹配一个或多个匹配项。

要匹配方括号内的任何大写 ASCII 字母,请替换\[(?:PLACE|NAME)]\[[A-Z]+].


推荐阅读