正则表达式,用于在标点符号之前提取单词

时间:2019-09-04 09:02:18

标签: python regex

我正在尝试提取出现在标点符号之前的短语,但该短语的形式应为大写单词。

  

抽象代数。考虑到的现代数学领域   待定义的代数结构及其上的运算,以及   扩展通常与实数相关的代数概念   系统到其他更通用的系统,例如组,环,字段,   模块和向量空间。

     

代数。数学的一个分支,使用符号或字母   代表变量,值或数字,然后可以用来   表达操作和关系并求解方程式。

     

代数表达式。等同于数字和字母的组合   语言中的短语,例如x2 + 3x-4。

     

解析(笛卡尔)几何:   坐标系以及代数和分析原理,因此   以数字方式定义几何形状并提取   该表示形式的数字信息。

     

归纳推理或逻辑:一种涉及移动的推理   从一组具体事实到一个总体结论,表明了一些   对结论的支持程度,但实际上并未确保结论的正确性   真相。

当前我正在使用以下正则表达式:

(([? ])([A-Z][a-z\s]+)?([A-Z][a-z\s]+?[.:]))

我对此有两个问题。

  1. 我认为这不是最佳的编写方式。
  2. 无法捕获短语中两个以上单词的单词

2 个答案:

答案 0 :(得分:2)

尝试^[A-Z][^.,:';]+

说明:

^-行首

[A-Z]-单个大写字符

[^.,:';]+-与.,:';

不同的一个或多个字符

Demo

答案 1 :(得分:1)

与当前数据不匹配超过1个单词的一个原因是该模式以[? ]开头,它将与空格或问号匹配。

您也可以省略某些捕获组,而只使用一个。请注意,由于字符类不包含[a-z\s]+?[.:]?

,因此您不必使用.使此匹配:非贪婪

要获取大写字母后跟.:,可以使用:

\b([A-Z][a-z]+(?:\s+[A-Z][a-z]+)*)[.:]

说明

  • \b字边界
  • (捕获第1组
    • [A-Z][a-z]+
    • (?:\s+[A-Z][a-z]+)*重复0次以上匹配A-Z和1次以上a-z
  • )关闭群组
  • [.:]匹配.:

Regex demo

如果您还想匹配用()包围的单词,则可以使用交替形式。

\b((?:\([A-Z][a-z]+\)|[A-Z][a-z]+)(?:\s+(?:\([A-Z][a-z]+\)|[A-Z][a-z]+))*)[.:]

Regex demo