我有一个正则表达式,主要用于查找字符串中的测量值(安培,瓦特或伏特)。字符串最多为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
答案 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组:a
,v
,w
,amp
,amps
,volt
,{{ 1}},volts
或watt
watts
- 一个单词边界。请注意,\b
匹配\d*\.?\d+
,0.12
和.12
值,您可以使用112
来避免匹配\d+(?:\.\d+)?
之类的值。
如果您在数字和测量单位之间有一个或多个空格,请将.12
替换为\s*
。您可以使用\s+
等字符类在此处添加更多字符(例如,添加[\s=-]
和=
)。随意定制更多。