代码之家  ›  专栏  ›  技术社区  ›  santoku

在正则表达式中,如何将字母数字字符串的模式与前后的空格或标点符号匹配

  •  3
  • santoku  · 技术社区  · 6 年前

    txt='.A3 S3- D4(SPACE) D5/ E9R E0&'
    

    如何提取所有匹配1个字母+1个数字的模式。标点符号(除&外)或空格可以在前面或后面,也可以在两者之间,但不允许在前面或后面再加一个字母。

    预期的匹配是:

    ['A3', 'S3', 'D4', 'D5']
    

    E9R将不会返回,因为它在E9之后包含一个字母。 E0&将不返回,因为它包含&

    import re
    re.findall('[a-z]{2,3}[0-9]{1,3}',txt)
    
    1 回复  |  直到 6 年前
        1
  •  5
  •   Wiktor Stribiżew    6 年前

    你可以用

    re.findall(r'(?<![a-z0-9&])[a-z][0-9](?![a-z0-9&])', s, re.I)
    

    regex demo

    • (?<![a-z0-9&]) -不是紧跟在ASCII字母、数字或 &
    • [a-z] -一个ASCII字母(注意 re.I
    • [0-9] -ASCII数字
    • (?![a-z0-9&]) -不紧跟ASCII字母、数字或 & .

    Python demo :

    import re
    rx = r"(?<![a-z0-9&])[a-z][0-9](?![a-z0-9&])"
    s = ".A3 S3- D4(SPACE) D5/ E9R E0&"
    print(re.findall(rx, s, re.I))
    # => ['A3', 'S3', 'D4', 'D5']