Regex 不选择是否包含其他字符

Regex 不选择是否包含其他字符,regex,Regex,假设我有以下数字: 3000公吨 300公吨 44000米 320米 我想选择44000米和3200米 我应该使用什么正则表达式只选择结尾有“m”的数字(逗号分隔),而不选择有“mt”的数字 这就是我尝试过的: \d+[,]?\d+m. 我不知道如何否定mt。下面这样的unix解决方案怎么样 > echo "3,000mt 300mt 44,000m 320m" | tr ' ' '\n' | awk -F" " ' $0~/m$/ { print } ' 44,000m 320m &g

假设我有以下数字:

3000公吨 300公吨 44000米 320米

我想选择44000米和3200米

我应该使用什么正则表达式只选择结尾有“m”的数字(逗号分隔),而不选择有“mt”的数字

这就是我尝试过的:

\d+[,]?\d+m.

我不知道如何否定mt。

下面这样的unix解决方案怎么样

> echo "3,000mt 300mt 44,000m 320m" | tr ' ' '\n' | awk -F" " ' $0~/m$/ { print } '
44,000m
320m
> 

您非常接近解决方案,只是错过了检查单词边界(由正则字符
\b
表示)的可能性。因此,与在正则表达式末尾使用任何字符
不同,您可能只会查看字符串是否以单词边界结尾(例如空格或换行符或其他字符):

在哪里

  • \d+
    查找任何数字(至少一个)
  • (,\d+)
    查找后跟一个或多个数字的逗号(使用括号将其分组,使用
    符号可完全选择整个分组)
  • 如上所述,
    m\b
    在单词末尾查找文本
    m
使用此正则表达式,您还可以匹配只有一个数字后跟m的字符串,如
9m
或类似字符串。与正则表达式相比,这是一个细微的变化(分组逗号后跟数字)

我通过Python验证了正则表达式,并添加了更多的边缘案例:

>>> import re
>>> text = "3,000mt 300mt 44,000m 1m 1mt 1,3mt 320m"
>>> re.findall(r"\d+(?:,\d+)?m\b", text)  # ?: is python specific for findall method
['44,000m', '1m', '320m']

这就是我尝试过的\d+[,]?\d+m。我不知道如何否定mt。谢谢你的回答,但我必须用regex
>>> import re
>>> text = "3,000mt 300mt 44,000m 1m 1mt 1,3mt 320m"
>>> re.findall(r"\d+(?:,\d+)?m\b", text)  # ?: is python specific for findall method
['44,000m', '1m', '320m']