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

2024-05-19 13:32:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个正则表达式,主要用于查找字符串中的测量值(安培、瓦特或伏特)。字符串长度最多为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)?的东西,它会出错。它将返回在字符串中找到的随机“s”字符。另外,我使用这么多捕获组的原因是,当我使用re.findall()时,它返回捕获组,因此我可以轻松地处理数据。我还使用了不区分大小写的标志

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

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

它会触发这些,即使后面的人会看到前面有一个字母。有没有办法让regex停止查找,因为lookback被触发了?我不能使用^字符,因为这些字符串很少位于字符串的开头

这是regex101 link with a few more examples。T型

这些不应该匹配:

ESQ45A
JW795A
SO15A
SQ18W
SQQ10W
AK10V

这些应匹配:

XYZ 5 amps
1 V
1123 w
5 Volt
1234 amp

Tags: 字符串re字符单元amp个字符zawatts
1条回答
网友
1楼 · 发布于 2024-05-19 13:32:40

从例子来看,你需要使用

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

参见regex demo

  • \b-单词边界
  • (\d*\.?\d+)-group1:一个整数或类浮点数
  • \s*-0+空格字符
  • (a(?:mps?)?|v(?:olts?)?|w(?:atts?)?)-第2组:avwampampsvoltvoltswattwatts
  • \b-单词边界

注意,\d*\.?\d+匹配0.12.12112值,您可以使用\d+(?:\.\d+)?来避免匹配类似.12的值

如果数字和度量单位之间有一个或多个空格,请将\s*替换为\s+。您可以使用[\s=-]这样的字符类在这里添加更多字符(例如,添加=-)。欢迎进一步定制

相关问题 更多 >