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

求可匹配4种相似输入模式的单一正则表达式

匹配特定格式字符串的正则表达式解决方案

需求概述

需要一个正则表达式,能匹配并捕获以下4种输入的对应部分:

  • Input_1: CountryINDIA → 捕获结果:Country, INDIA
  • Input_2: CountryIndia → 捕获结果:Country, India
  • Input_3: CountryINDIAAustralia → 捕获结果:Country, INDIA, Australia
  • Input_4: CountryIndiaAustralia → 捕获结果:Country, India, Australia

现有尝试的问题

你使用的正则表达式:

(^[A-Z][a-z]+)([A-Z]\w.*(?=[A-Z]))?((?<=[A-Z])\w.*$)

仅能正确匹配Input_3,处理Input_1时会错误捕获为('Country', 'INDI', '')。核心问题是其中的正向预查(?=[A-Z])要求INDIA后必须存在大写字母,但Input_1中INDIA是字符串结尾,导致只匹配到INDI,最后一组为空。

解决方案

适配多场景的正则表达式

针对所有输入场景,可使用以下正则(以Python环境为例,支持精准分组捕获):

^([A-Z][a-z]+)(?:([A-Z]+)|([A-Z][a-z]+))(?:([A-Z][a-z]+))?$

正则逻辑解释

  • ^([A-Z][a-z]+):匹配开头首字母大写、后续全小写的前缀(如Country),作为第一个捕获组。
  • (?:([A-Z]+)|([A-Z][a-z]+)):非捕获组包裹两种匹配规则,匹配第一个后续片段:
    • ([A-Z]+):捕获全大写序列(如INDIA)
    • ([A-Z][a-z]+):捕获首字母大写、后续小写的单词(如India)
  • (?:([A-Z][a-z]+))?$:可选非捕获组,匹配第二个后续小写开头的单词(如Australia),仅在存在时捕获。

测试验证

使用Python代码验证所有输入:

import re

pattern = r'^([A-Z][a-z]+)(?:([A-Z]+)|([A-Z][a-z]+))(?:([A-Z][a-z]+))?$'
test_cases = [
    'CountryINDIA',
    'CountryIndia',
    'CountryINDIAAustralia',
    'CountryIndiaAustralia'
]

for case in test_cases:
    match = re.fullmatch(pattern, case)
    if match:
        # 过滤空分组,整理输出结果
        result = [g for g in match.groups() if g]
        print(f"{case} → {', '.join(result)}")

输出结果:

CountryINDIA → Country, INDIA
CountryIndia → Country, India
CountryINDIAAustralia → Country, INDIA, Australia
CountryIndiaAustralia → Country, India, Australia

通用简化方案

如果需要支持更多后续单词,可使用re.findall结合更简洁的正则:

[A-Z][a-z]*|[A-Z]+

该正则会直接提取所有符合规则的片段,示例代码:

for case in test_cases:
    parts = re.findall(r'[A-Z][a-z]*|[A-Z]+', case)
    print(f"{case} → {', '.join(parts)}")

输出结果与上述一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 22:02:38