You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python正则表达式优化:排除Liquidator/Registrar前至多5个关联姓名

需求与代码修改方案

需求说明

从目标文本中保留公司名称,排除Liquidator(s)或Registrar(s)之前的所有姓名。规则如下:

  • 姓名和公司名称除包含Van、Mc等中间前缀外,其余均为大写字母
  • 现有代码仅能处理由至多3个大写词组成的单个姓名,需修改为可排除用“and”连接的至多5个关联姓名

原有代码

import re
def find_patterns(text):
  liquidator_match = re.search(r',\s*(Liquidator[s]|Registrar[s])\b', text)
  if liquidator_match:
    pre_liquidator_text = text[:liquidator_match.start()].rstrip()
    pre_liquidator_text = re.sub(r'(\b[A-Z\.-]{2,}\b(?:\s+|$)){1,3}$', '',pre_liquidator_text).strip()
    cleaned_text = pre_liquidator_text 
  else:
    cleaned_text = text
  return cleaned_text


def extract_company_name_from_text(text):
  newtext = find_patterns(text)
  pattern = r'\b[A-Z-](?:[A-Z0-9 \t&.-](?:\s*\(\w+\))?)*(?:\b|(?<=\)))'
  
  matches = re.findall(pattern, newtext)
  cleaned_matches = [match for match in matches if not match.startswith("CIV") and len(match.split()) > 1]
  return cleaned_matches
  
text = """XYZ LIMITED random text VAN IVAN, ARON SMITH, PETER BIRD and DAVID GLANZ, Registrars"""  
print(extract_company_name_from_text(text))

示例文本与预期结果

示例文本1

XYZ LIMITED random text VAN IVAN, ARON SMITH, PETER BIRD and DAVID Mc GLANZ, Registrars

预期结果1

XYZ LIMITED

示例文本2

this notice is for long long text long long text long long text long long text CITY PROPERTY MANAGEMENT LIMITED long long text long long text long long text long long text THINK DEVELOPMENTS LIMITED (long long text long long text by 20 May 2025. KATY PRONK, THOMAS McLENNAN, DANIEL SMITH, STEVE DUNKEN and PETER van HELLEN, Liquidators

预期结果2

CITY PROPERTY MANAGEMENT LIMITED, THINK DEVELOPMENTS LIMITED

修改后的代码

import re
def find_patterns(text):
  liquidator_match = re.search(r',\s*(Liquidator[s]|Registrar[s])\b', text)
  if liquidator_match:
    pre_liquidator_text = text[:liquidator_match.start()].rstrip()
    # 匹配用逗号分隔、最后用and连接的至多5个姓名,支持Van/Mc等前缀
    name_pattern = r'(?:\b[A-Z][A-Z\.-]*\s*(?:Van|van|Mc|mc)?\s*[A-Z\.-]+\b(?:,\s*)?){1,4}\s*and\s*\b[A-Z][A-Z\.-]*\s*(?:Van|van|Mc|mc)?\s*[A-Z\.-]+\b$|(?:\b[A-Z][A-Z\.-]*\s*(?:Van|van|Mc|mc)?\s*[A-Z\.-]+\b(?:,\s*)?){1,5}$'
    pre_liquidator_text = re.sub(name_pattern, '', pre_liquidator_text).strip()
    cleaned_text = pre_liquidator_text 
  else:
    cleaned_text = text
  return cleaned_text


def extract_company_name_from_text(text):
  newtext = find_patterns(text)
  pattern = r'\b[A-Z-](?:[A-Z0-9 \t&.-](?:\s*\(\w+\))?)*(?:\b|(?<=\)))'
  
  matches = re.findall(pattern, newtext)
  cleaned_matches = [match for match in matches if not match.startswith("CIV") and len(match.split()) > 1]
  return cleaned_matches

# 测试示例1
text1 = """XYZ LIMITED random text VAN IVAN, ARON SMITH, PETER BIRD and DAVID Mc GLANZ, Registrars"""  
print(extract_company_name_from_text(text1))  # 输出: ['XYZ LIMITED']

# 测试示例2
text2 = """this notice is for long long text long long text long long text long long text CITY PROPERTY MANAGEMENT LIMITED long long text long long text long long text long long text THINK DEVELOPMENTS LIMITED (long long text long long text by 20 May 2025. KATY PRONK, THOMAS McLENNAN, DANIEL SMITH, STEVE DUNKEN and PETER van HELLEN, Liquidators"""
print(extract_company_name_from_text(text2))  # 输出: ['CITY PROPERTY MANAGEMENT LIMITED', 'THINK DEVELOPMENTS LIMITED']

修改说明

核心修改点在find_patterns函数的正则表达式:

  • 新增对姓名中Van/van/Mc/mc这类前缀的匹配支持
  • 设计双分支匹配规则:覆盖“逗号分隔+and收尾”以及“纯逗号分隔”两种多姓名格式,最多匹配5个关联姓名
  • 精准删除Liquidator(s)/Registrar(s)前的所有姓名内容,完整保留前置的公司名称

内容的提问来源于stack exchange,提问作者Totura

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 10:25:00