【问题标题】:Regex python find uppercase names正则表达式 python 查找大写名称
【发布时间】:2023-03-03 00:39:02
【问题描述】:

我有一个文本文件类型:

[...演讲...]

NAME_OF_SPEAKER_1:[...演讲...]

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

我的目标是隔离不同演讲者的演讲。因为每个发言者的名字总是用大写字母(名字+姓氏)表示,所以它们被清楚地识别出来。但是,在演讲中可以有大写字母的名词(不是人名),但实际上只有一个词长到足以让我发出问题(它有四个字母,说它是'ABCD')。我想用类似的东西来识别每个说话者名字的位置(我假设每个名字都至少有 3 个字母)

re.search('[A-Z^(ABCD)]{3,}',text_to_search)

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

【问题讨论】:

    标签: python regex regular-language


    【解决方案1】:

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

    [ABCD][(ABCD)][A-D] 相同。

    [^(ABCD)] 匹配任何不属于 A-D 的字符

    我会尝试一些不同的东西:

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

    【讨论】:

      【解决方案2】:

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

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

      您可以使用否定前瞻(?! 断言仅由大写字符 A-Z 组成的单词不包含 ABCD,而不是使用否定字符类。

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

      Regex demo

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

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

      Regex demo

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-28
        • 2017-01-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多