如果满足某些条件,如何匹配整个字符串

时间:2021-05-25 13:44:26

标签: regex

我在尝试从字符串中分离大小方面做了很多工作,但是我遇到了一些问题。

当前

https://regex101.com/r/zbEtOU/1

当前正则表达式

^([a-z]+\d*(?:\s*-\s*[a-z\d]+[/-][a-z\d]+)?|\d+)

示例:

30/32

固定 8 (32-36)

XS/S

米/升

1-2Y

秒/米

0-3M

32

预期结果:

我想从中分离出第一个值,但是当我遇到括号时,我想匹配这些值。

示例中的实际期望结果:

30/32 = 30

固定 8 (32-36) = 32

XS/S = XS

m/l = m

1-2Y = 1-2Y(我猜在这种情况下没有办法输出“1Y”?否则它会与 1-2M 重叠​​导致混淆作为 1 != 1 在这种情况下。发生这种情况时,我更愿意获得原始字符串)理想情况 = 1Y

s/m = s

1-3M = 1-3M(我猜在这种情况下没有办法输出“1M”?否则它会与 1-2Y 重叠导致混淆在这种情况下为 1 != 1。发生这种情况时,我更愿意获取原始字符串) 理想情况 = 1M

32 = 32

我真的无法解决这个问题,因为这里有很多不同的条件! 所有正则表达式都运行不敏感,因此无需担心大写字母。

有人找到了解决我问题的好方法吗??

所有内容都需要在第 1 组中捕获 - 否则我的系统无法将其隔离

在 Python 3.7 中运行

1 个答案:

答案 0 :(得分:0)

你可以使用

(?:^|.*\()(\d+(?:-\d+[A-Za-z]{1,3})?|[A-Za-z]{1,3})\b

参见regex demo

详情

  • (?:^|.*\() - 字符串的开头或除换行符以外的任何零个或多个字符,然后是一个 ( 字符
  • (\d+(?:-\d+[A-Za-z]{1,3})?|[A-Za-z]{1,3}) - 第 1 组:
    • \d+(?:-\d+[A-Za-z]{1,3})? - 一个或多个数字,后跟一个可选的 -,一个或多个数字,然后是一到三个 ASCII 字母
    • | - 或
    • [A-Za-z]{1,3} - 一个、两个或三个 ASCII 字母
  • \b - 一个词边界。