【问题标题】:Regex to extract acronyms正则表达式提取首字母缩写词
【发布时间】:2018-11-05 06:30:53
【问题描述】:

我正在使用正则表达式从 python 中的文本中提取首字母缩写词(仅限特定类型)。

  • ABC(圆括号或方括号内或词尾之间的所有大写字母)
  • A.B.C(同上,但中间只有一个“.”)
  • A&B&C(同上,但中间只有一个“&”)

到目前为止我正在使用

text = "My name is STEVE. My friend works at (I.A.). Indian Army(IA). B&W also B&&W Also I...A"
re.findall('\\b[A-Z][A-Z.&]{2,7}\\b', text)

Output is : ['STEVE', 'I.A', 'B&W', 'B&&W', 'I...A']
I want to exclude B&&W and I..A, but include (IA). 

我知道以下链接,但我无法正确使用它们。请帮忙。

Extract acronyms patterns from string using regex

Finding Acronyms Using Regex In Python

RegEx to match acronyms

【问题讨论】:

    标签: regex python-3.x


    【解决方案1】:

    你想要的是一个大写字母,后面是一堆大写字母,中间有可选的点或&符号。

    re.findall('\\b[A-Z](?:[\\.&]?[A-Z]){1,7}\\b', text)
    

    分解:

    • 所有反斜杠都加倍,因为它们需要转义
    • \b字边框
    • [A-Z]首都
    • (?:开启非捕获组
    • [\.&] 包含.& 的字符类
    • ? 可选
    • [A-Z] 后跟另一个大写
    • ) 关闭非捕获组的可选.&,后跟大写字母
    • {1,7} 重复该组 1 - 7 次
    • \b字边框

    我们需要一个非捕获组,因为re.findall 返回组(如果存在)。

    有更好的方法来匹配适用于所有 Unicode 字符的大写字母。

    确实匹配B&WWB&W.W,因为我们不会每次都强制使用(相同的)字符。如果你愿意,表达式会变得更复杂(虽然不多)。

    【讨论】:

    • 嗨@SQB 它只是从“STEVE”中捕获了 E,从“Army(IA)”中捕获了 A。我认为它只是捕获长度 {1, 7} Output - [('E', ''), ('A', '')] 内的匹配的最后一个字符
    • 啊,当然。分组有干扰。 re.findall 如果存在则返回组,因此我将组更改为非捕获。我还将另一个组更改为字符类,因为它本来应该是。
    • 这看起来不错。谢谢@SQB 只是为了澄清(?:[ 中的 ?: 用于非分组,&]?[A 中的 ? 用于 0 或 1 个匹配。我对么??您是否还可以推荐一些对主正则表达式的良好参考。..
    【解决方案2】:

    如果大写字母之间必须只有&,或.或空字符串,并且它们可能出现不一致(如这个假的NA&T.O字符串),你可以使用

    re.findall(r'\b[A-Z](?:[&.]?[A-Z])+\b', text)
    

    请参阅regex demo。它匹配以单个大写字母开头的整个单词,然后包含一个或多个可选的&. 序列,后跟另一个大写字母。

    在这里,我会建议

    [x.group() for x in re.finditer(r'\b[A-Z](?=([&.]?))(?:\1[A-Z])+\b', text)]
    

    或者,如果你 见regex demo

    模式详情

    • \b - 字边界
    • [A-Z] - 大写字母
    • (?=([&.]?)) - 包含一个捕获组的正向前瞻,该捕获组将可选的 &. 字符捕获到第 1 组中
    • (?:\1[A-Z])+ - 出现一次或多次
      • \1 - 相同的字符被捕获到第 1 组(所以,你不会得到 A.T&W
      • [A-Z] - 大写字母
    • \b - 字边界。

    Python demo:

    import re
    rx = r"\b[A-Z](?=([&.]?))(?:\1[A-Z])+\b"
    s = "My name is STEVE. My friend works at (I.A.). Indian Army(IA). B&W also B&&W Also I...A"
    print( [x.group() for x in re.finditer(rx, s)] )
    # => ['STEVE', 'I.A', 'IA', 'B&W']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多