代码之家  ›  专栏  ›  技术社区  ›  Fabio Piunti

匹配多个特定位置

  •  0
  • Fabio Piunti  · 技术社区  · 6 年前

    /^((.{0}1.*)|(.{1}2.*)|(.{2}3.*)|(.{3}4.*))$/g
    

    这与1234相同位置几乎包含一个数字的每个字符串相匹配。

    一个想法是构建一个正则表达式,在正确的位置匹配每个字符,然后在我的python代码中,我将编写如下内容:

    n_matches = len(re.findall(regex, val))
    if n_matches == matches_to_hit:
        ...
    

    但我被困在这里。。有什么想法吗?

    更新

    • 123无效
    • 1234有效
    • 9874有效
    • 12345无效

    我要检查输入A和输入B是否有n个数字在同一位置

    • 输入A=9837
    • 输入B=1234

    所以如果n是1,那么regex应该返回metch。如果n>1否,因为只有数字3在输入A和输入B中处于相同位置。

    1 回复  |  直到 6 年前
        1
  •  0
  •   kirilloid    6 年前

    这可以通过否定的前向和后向引用(和组)来实现。正则表达式如下所示:

    \d \d (?!\1) . 然后是另一个数字 \d (?!(\1|\2)) 等等。

    /^
      (\d)
      (?!\1)(\d)
      (?!(\1|\2))(\d)
      (?!(\1|\2|\3))(\d)
      \D*
      $
    /x
    

    如果您需要使它匹配整个字符串和某些特定位置,可以删除 ^ / $ \D (不是数字)用量词 * , + 属于 {10}

    附言:我建议阅读这个网站 https://www.regular-expressions.info/

    PPS:在实际的项目中,我会实现完全不带正则表达式的那个。

    digits = [c for c in str if c.isdigit()]
    return len(digits) == 4 and len(set(digits)) == 4