Python Regex捕获多个大写单词和相邻单词

时间:2014-07-27 02:45:14

标签: python regex string capitalization

我有一个正则表达式执行以下操作:

  1. 找到一个包含两个或更多相邻大写字母A-Z的单词(“multi caps word”);
  2. 如果可能,将匹配向左和向右延伸到另一个多字帽字,只要每个多字帽字之间不超过三个非多字帽字;和
  3. 将匹配扩展到左侧和右侧,分别包含5个和3个非多字大小的单词序列。
  4. 我的正则表达式捕获了所需的模式,但是当存在相邻的多个大写单词时返回各种重叠匹配,如下面的AA BB DD。请帮我调整我的正则表达式按照需要工作。

    这是我的草稿代码:

    str1 =   'z z z z z11 AA BB DD f f d e gd df sdf ggf we AA ff d f f'
    re.findall(r'(?=(\s(?:[^\s]+[\s]+){5}(?:[^A-Z\s]*[A-Z][A-Z]+(?:[^\s]+[\s]+){1,3}?)*?[^A-Z\s]*[A-Z][A-Z]+.*?(?:[\s]+[^\s]+){3}\s))', str1)
    

    实际输出:

    Match 1 - 'z z z z z11 AA BB DD f'
    Match 2 - 'z z z z11 AA BB DD f f'
    Match 3 - 'z z z11 AA BB DD f f d'
    Match 4 - 'gd df sdf ggf we AA ff d f'
    

    期望的输出:

    Match 1 - 'z z z z z11 AA BB DD f f d'
    Match 2 - 'gd df sdf ggf we AA ff d f'
    

1 个答案:

答案 0 :(得分:1)

试试这个:

>>> pattern = r'(?:[a-z\d]+\s*){0,5}(?:[A-Z]+)(?:\s*[A-Z]+)*(?:\s*[a-z]+){0,3}'
>>> re.findall(pattern, str1)
['z z z z z11 AA BB DD f f d', 'gd df sdf ggf we AA ff d f']