首页 > 解决方案 > 如果满足某些条件,如何匹配整个字符串

问题描述

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

当前

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-2年

秒/米

0-3M

32

期望的结果:

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

因此,示例中的实际期望结果:

30 /32 = 30

固定 8 ( 32 -36) = 32

XS /S = XS

/升 =

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 中运行

标签: regex

解决方案


您可以使用

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

请参阅正则表达式演示

详情

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

推荐阅读