【问题标题】:Regex satisfying several conditions满足几个条件的正则表达式
【发布时间】:2021-01-22 13:00:46
【问题描述】:

使用 python,我正在尝试识别验证以下条件的字符串:

  1. 必须包含 9 个字符
  2. 字符 2 到 8 必须是数字
  3. 字符 1 和 9 可以是数字或字母(小写或大写)
  4. 字符 1 和 9 不能同时是数字。

例如,“A12345678”、“01234567A”和“A1234567B”将匹配,但“012345678”将不匹配。

对于条件 1 到 3,我使用 '([a-z]|[A-Z]|[0-9])[0-9]{7}([a-z]|[A-Z]|[0-9])$'。对于条件 4,我使用 '(?![0-9]{9}$)'。但是,我不知道如何在一个独特的正则表达式中加入这些条件。有人可以帮助我吗?提前致谢!

【问题讨论】:

  • 我弄错了,对不起。条件4是不能同时是数字

标签: python regex


【解决方案1】:

将两个案例分开(前面有字母/后面有字母)

^([A-Z][0-9]{7}[A-Z0-9]|[A-Z0-9][0-9]{7}[A-Z])$

应用“不区分大小写”标志。

【讨论】:

  • 谢谢,这行得通!但是添加第一个和最后一个可以是两个字母'^([A-Z][0-9]{8}|[0-9]{8}[A-Z]|[A-Z][0-9]{7}[A-Z])$'
  • @JN_2605 哦,没错。查看更新的答案。
【解决方案2】:

或者,您可以尝试:

^(?=\D?\d{7,8}\D?$)[A-Z\d]{9}

在线查看demo

  • ^ - 开始字符串锚点。
  • (?= - 打开一个积极的前瞻。
    • D? - 可选非数字。
    • \d{7,8} - 7 位或 8 位数字。
    • D? - 可选非数字。
    • $) - 结束字符串锚点并关闭正向前瞻。
  • [A-Z\d]{9} - 给定类的 9 个字符。

或者,假设单个字符串验证,您可以尝试:

^(?!\d{9}|.*_|.+\D.)\w{9}$
  • ^ - 开始字符串锚点。
  • (?! - 打开负前瞻:
    • \d{9} - 九位数字。
    • | - 或者:
    • .*_ - 字符串中任意位置的任何下划线。
    • | - 或者:
    • .+\D. - 任何 1+ 字符后跟非数字字符和另一个字符。
    • ) - 关闭负前瞻。
  • \w{9} - 九个单词字符。
  • $ - 结束字符串锚。

【讨论】:

  • 这很聪明,我喜欢。 :)
【解决方案3】:

这个

 r"^((?:[0-9]{8})(?:[a-z]|[A-Z])|(?:[a-z]|[A-Z])(?:[0-9]{8})|(?:[a-z]|[A-Z])[0-9]{7}(?:[a-z]|[A-Z]))$"

 # or with ignore case
 r"^([0-9]{8}[a-z]|[a-z][0-9]{8}|[a-z][0-9]{7}[a-z])$"

会匹配

(?:[0-9]{8})(?:[a-z]|[A-Z])             # 8 numbers + letter
(?:[a-z]|[A-Z])(?:[0-9]{8})             # letter + 8 numbers
(?:[a-z]|[A-Z])[0-9]{7}(?:[a-z]|[A-Z])  # letter + 7 numbers + letter

您可以使用re.I flag for case insensitivity 减少它。

我将捕获组替换为非分组组。

演示:https://regex101.com/r/Nr5wus/3https://regex101.com/r/bypoGq/2(忽略大小写)

【讨论】:

    【解决方案4】:

    您可以在正则表达式模式中使用条件:

    ^(?:([A-Z])|[0-9])[0-9]{7}(?(1)[A-Z0-9]|[A-Z])$
    

    请参阅regex demo

    详情

    • ^ - 字符串开头
    • (?:([A-Z])|[0-9]) - 一个字母(在第 1 组中捕获)或一个数字
    • [0-9]{7} - 七位数
    • (?(1)[A-Z0-9]|[A-Z]) - 如果第 1 组匹配,匹配一个字母或数字,否则,只匹配一个字母
    • $ - 字符串结束。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-02
      • 2022-07-21
      • 1970-01-01
      • 2019-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多