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

时间:2018-08-20 19:30:23

标签: python regex

我有这样的输入

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 个答案:

答案 0 :(得分:5)

您可以使用

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']