提问者:小点点

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


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

  1. 查找具有两个或多个相邻大写字母a-Z的单词(“多大写单词”)
  2. 如果可能,将匹配项向左和向右扩展到另一个多大写单词,只要每个多大写单词之间的非多大写单词不超过三个;和
  3. 将匹配扩展到左侧和右侧,以分别包含5个和3个非多大写单词的序列

我的正则表达式捕获所需的模式,但当存在相邻的多大写单词时,会返回多种重叠匹配,如下面的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个答案

匿名用户

试试这个:

>>> 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']