我有一个正则表达式,主要用于查找字符串中的测量值(安培、瓦特或伏特)。字符串的长度最多为 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 |
它会触发那些,即使后视应该看到它前面有一个字母。有没有办法让正则表达式停止寻找,因为后视被触发了?我不能使用 ^ 字符,因为这些字符串很少出现在字符串的开头
这是 regex101 link with a few more examples .
这些不应该匹配:
ESQ45A
JW795A
SO15A
SQ18W
SQQ10W
AK10V
这些应该匹配:
XYZ 5 amps
1 V
1123 w
5 Volt
1234 amp
请您参考如下方法:
从例子来看,你需要使用
\b(\d*\.?\d+)\s*(a(?:mps?)?|v(?:olts?)?|w(?:atts?)?)\b
参见 regex demo .
\b- 单词边界(\d*\.?\d+)- 第 1 组:类似 int 或 float 的数字\s*- 0+ 个空白字符(a(?:mps?)?|v(?:olts?)?|w(?:atts?)?)- 第 2 组:a,v,w,amp,amps,volt,volts、watt或watts\b- 单词边界。
请注意,\d*\.?\d+ 匹配 0.12、.12 和 112 值,您可以使用 \d+(?:\.\d+)? 来避免匹配 .12-like 值。
如果数字和度量单位之间有 1 个或多个空格,请将 \s* 替换为 \s+。您可以使用 [\s=-] 之类的字符类在此处添加更多字符(例如,添加 = 和 -)。随意进一步定制。
