正则表达式 python 查找大写名称

Regex python find uppercase names

我有一个类型的文本文件:

[...语音...]

NAME_OF_SPEAKER_1:[...语音...]

NAME_OF_SPEAKER_2:[...语音...]

我的目的是隔离不同演讲者的演讲。他们被清楚地识别出来,因为每个演讲者的名字总是以大写字母(名字+姓氏)表示。但是,在演讲中可以有大写的名词(不是人名),但实际上只有一个单词足够长给我出题(它有四个字母,说是'ABCD') .我想用

之类的东西来识别每个演讲者姓名的位置(我假设每个名字至少有 3 个字母)
re.search('[A-Z^(ABCD)]{3,}',text_to_search)

为了排除那个特定的(常量)词'ABCD'。但是,该命令会识别该词而不是排除它。关于如何克服这个问题的任何想法?

方括号[] 仅匹配单个字符。此外,方括号内的圆括号 () 仅匹配单个字符。这意味着:

[ABCD][(ABCD)]等同于[A-D]

[^(ABCD)] 匹配任何字符,但不是 A-D

我会尝试不同的东西:

^[A-Z]*?: 匹配以大写字母书写的每个单词,从一行的开头开始,后面跟一个冒号

在您尝试的模式中,您会得到部分匹配,因为没有边界,并且 [A-Z^(ABCD)]{3,} 将匹配任何列出的字符 3 次或更多次。

A-Z也会匹配ABCD,所以也可以写成[A-Z^)(]{3,}

您可以使用否定先行 (?!

断言仅由大写字符 A-Z 组成的单词不包含 ABCD,而不是使用否定字符 class
\b(?![A-Z]*ABCD)[A-Z]{3,}\b

Regex demo

如果名称应以 3 个大写字符开头,并且可以包含小写字符、下划线或数字,则可以在匹配 3 个大写字符后添加 \w*

\b(?![A-Z]*ABCD)[A-Z]{3}\w*\b

Regex demo