Skip to main content
 首页 » 编程设计

python之即使应该触发后视,正则表达式也会获取值

2024年08月16日43yxwkf

我有一个正则表达式,主要用于查找字符串中的测量值(安培、瓦特或伏特)。字符串的长度最多为 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=-] 之类的字符类在此处添加更多字符(例如,添加 = 和 -)。随意进一步定制。