通过shell终端仅使用regex提取(从文本中)不重复的单词



我只想提取下面文本中不会重复的单词。我只想使用regex,我看到了一些类似的问题,如在"仅从不包含重复字母的列表中提取那些单词"中,使用regex(不重复字母(和"正则表达式:匹配仅包含不重复单词的字符串"。我希望结果是一个不重复的单词列表,这些单词按照它们在文本中出现的自然顺序出现。

常用格式的文本:

教学心理学是教育心理学的一部分学校教育。正如稍后将看到的,两者具有相同的目的:研究、解释和理解由于参与教育活动是什么使一个实体适合教学心理学的本质和特点存在于行为基础上的教育活动研究的变化。

我的文本在垂直列表中逐字逐句单独列出(如果这样使用更容易的话(使用这个问题的答案

如果您需要纯正则表达式解决方案,则只能使用.NET或Python-PyPi正则表达式来实现,因为您需要正则表达式库通常不具备的两项功能:1(从右到左输入字符串解析和2(无限宽查找。

这里有一个Python解决方案:

import regex
text="Teaching psychology is the part of educational psychology that refers to school education. As will be seen later, both have the same objective: to study, explain and understand the processes of behavioral change that are produce in people as a consequence of their participation in activities educational What gives an entity proper to teaching psychology is the nature and the characteristics of the educational activities that exist at the base of the of behavioral change studied."
rx = r'(?rus)(?<!b1b.*?)b(w+)b'
print (list(reversed(regex.findall(rx, text))))

查看在线演示。

详细信息

  • (?rus)-r启用从右到左的输入字符串解析(正则表达式中的所有模式像往常一样从左到右匹配,因此匹配文本不会反转(,Python 2中的u用于使w具有Unicode意识,这是Python 3中的默认选项,s是使.匹配换行的DOTALL修饰符
  • (?<!b1b.*?)-如果在当前位置的左侧,有任何0+个字符,则不匹配,然后与第1组中捕获的文本相同(见后面的表达式(,作为整个单词
  • b(w+)b-一个完整的单词,单词边界内的1个以上单词字符

reversed用于按原始顺序打印单词,因为从右到左的正则表达式从头到尾都与它们匹配。

最新更新