即使应该触发lookbehind,正则表达式也会获得值

时间:2018-04-08 19:07:09

标签: python regex

我有一个正则表达式,主要用于查找字符串中的测量值(安培,瓦特或伏特)。字符串最多为80个字符。这是我正在使用的正则表达式:

(?<![a-zA-Z])[\-\s\(,\n=]?([0-9?\.?]+\-?)\s?(amps|volts|watts|volt|amp|watt|a|v|w){1}(?![a-zA-Z]+)

我在单元规范中如此具体的原因是,当我尝试将它放入python的re模块时,如果我要使用类似watt(s)?的东西,那就太麻烦了。它会随机返回&#34; s&#34;它在字符串中找到的字符。此外,我使用这么多捕获组的原因是,当我使用re.findall()时,它返回捕获组,因此我可以轻松处理数据。我也使用不区分大小写的标志。

这是我遇到的问题的一个示例,如下表所示:

| String     | Result   |
|------------|----------|
| E2A        | 2 Amps   |
| ESQ45A     | 5 Amps   |
| JW795A     | 795 Amps |

它触发了那些,即使看后面应该看到它前面有一个字母。有没有办法让正则表达式停止寻找,因为触发了后卫?我不能使用^字符,因为这些字符串很少出现在字符串的开头

这是regex101 link with a few more examples。 Ť

这些不应该匹配:

ESQ45A
JW795A
SO15A
SQ18W
SQQ10W
AK10V

这些应匹配:

XYZ 5 amps
1 V
1123 w
5 Volt
1234 amp

1 个答案:

答案 0 :(得分:3)

根据示例判断,您需要使用

\b(\d*\.?\d+)\s*(a(?:mps?)?|v(?:olts?)?|w(?:atts?)?)\b

请参阅regex demo

  • \b - 字边界
  • (\d*\.?\d+) - 第1组:类似int或类似浮动的数字
  • \s* - 0+空白字符
  • (a(?:mps?)?|v(?:olts?)?|w(?:atts?)?) - 第2组:avwampampsvolt,{{ 1}},voltswatt
  • watts - 一个单词边界。

请注意,\b匹配\d*\.?\d+0.12.12值,您可以使用112来避免匹配\d+(?:\.\d+)?之类的值。

如果您在数字和测量单位之间有一个或多个空格,请将.12替换为\s*。您可以使用\s+等字符类在此处添加更多字符(例如,添加[\s=-]=)。随意定制更多。