Python正则表达式提取文本出现多余字符,求优化解决
修正方案
问题分析
你的原正则表达式因字符集包含逗号、括号等分隔符,且未排除(In Relation)这类不需要的后缀,导致匹配出多余的(, ,等无效内容。我们可以通过两种方式调整逻辑,得到符合预期的结果。
方案一:分割条目后清理后缀(简单直观)
先按逗号拆分每个公司条目,再单独去除每个条目末尾的(In Relation)后缀,保留合法的年份括号(如(2005)):
import re def extract_name(title): # 按逗号分割并去除每个条目的前后空格 companies = [comp.strip() for comp in title.split(',')] cleaned_companies = [] for comp in companies: # 替换掉末尾的 (In Relation) 部分 cleaned = re.sub(r'\s+\(In Relation\)$', '', comp) cleaned_companies.append(cleaned) return ', '.join(cleaned_companies) if cleaned_companies else None
测试验证:
test_input = "THETA COMMERCIALS (2005) LIMITED, TEST CONNECTIONS LTD (In Relation), NANO CARE LIMITED (In Relation)" print(extract_name(test_input)) # 输出:THETA COMMERCIALS (2005) LIMITED, TEST CONNECTIONS LTD, NANO CARE LIMITED
方案二:精准正则一次性匹配
用正则直接匹配所有符合要求的公司名称,排除(In Relation)后缀,同时避免匹配分隔符:
import re def extract_name(title): # 正则逻辑:匹配逗号后/开头的公司名称,排除末尾的(In Relation) pattern = r'(?<=,|^)\s*([A-Z0-9\s&.,()-]+?)(?=\s*\(In Relation\)(?:,|$)|,|$)' matches = re.findall(pattern, title) # 清理每个匹配结果的前后空格 cleaned_matches = [match.strip() for match in matches] return ', '.join(cleaned_matches) if cleaned_matches else None
正则解释:
(?<=,|^):匹配位置在逗号之后或字符串开头[A-Z0-9\s&.,()-]+?:非贪婪匹配公司主体内容(允许字母、数字、空格、&、.、,、()、-)(?=\s*\(In Relation\)(?:,|$)|,|$):正向预查,确保后面是(In Relation)+逗号/结尾,或者直接是逗号/结尾,避免包含无效后缀
内容的提问来源于stack exchange,提问作者Totura
相关产品推荐
相关产品推荐

