【问题标题】:Regex to match between 2 and 5 characters, one of which must be alphabetic正则表达式匹配 2 到 5 个字符,其中一个必须是字母
【发布时间】:2020-12-16 15:03:46
【问题描述】:

我不擅长正则表达式,下面的内容让我很困惑。

我只需要在一个字符串中查找所有匹配项,该字符串的长度在 2 到 5 个字符 [A-Z0-9] 之间,并且必须至少包含一个字母字符 [A-Z]

所以

A1 - Match
AAA - Match
AAAAAA - No Match
A1234 - Match
123 - No Match
A123A - Match
A - No Match
1 - No Match
A1B2C3 - No Match

我试过这个:

([A-Z0-9]*[A-Z][A-Z0-9]*){2,5}

但它不会将匹配的总长度限制在 2 到 5 个字符之间

【问题讨论】:

    标签: python-3.x regex


    【解决方案1】:

    你可以使用

    \b(?=\d*[A-Z])[A-Z\d]{2,5}\b
    \b(?=[A-Z0-9]{2,5}\b)[A-Z0-9]*[A-Z][A-Z0-9]*\b
    

    请参阅 regex demo #1regex demo #2。详情:

    • \b - 字边界
    • (?=\d*[A-Z]) - 在零个或多个数字之后,必须有一个大写的 ASCII 字母
    • (?=[A-Z0-9]{2,5}\b) - 单词边界前必须有 2 到 5 个 alnum 字符
    • [A-Z0-9]* - 零个或多个大写 ASCII 字母或数字
    • [A-Z] - 一个大写的 ASCII 字母
    • [A-Z\d]{2,5} - 两到五个大写 ASCII 字母或数字
    • \b - 字边界。

    Python demo

    import re
    text = "A1 AAA....A1234!!!!~A123A abc,AAAAAA,123,A,1,A1B2C3"
    print(re.findall(r'\b(?=[A-Z0-9]{2,5}\b)[A-Z0-9]*[A-Z][A-Z0-9]*\b', text))
    # => ['A1', 'AAA', 'A1234', 'A123A']
    

    【讨论】:

    • 谢谢。我需要在一个字符串中找到多个匹配项,所以如果我使用 ^ 和 $ 以上将不起作用。如果我删除它们,它可以工作但匹配字符串的部分部分。当我希望该子字符串不匹配时,A1 AAA AAAAAA A1234 123 A123A A 1 A1B2C3 导致 AAAAAA 的第 5 个字符匹配
    • @TheWelshDragon 已修复。
    【解决方案2】:

    试试这个 ^([A-Z][A-Z0-9]{1,4}|[A-Z0-9][A-Z][A-Z0-9]{,3}|[A-Z0-9]{1,2}[A-Z][A-Z0-9]{,3}|[A-Z0-9][A-Z][A-Z0-9])$

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-28
      • 1970-01-01
      • 2022-01-12
      相关资源
      最近更新 更多