我正在尝试使用正则表达式来确定字符串是否包含小于 500 英尺的值。重要的是,匹配有一些关键的约束和假设:
- 可以假定逗号已被删除。小数保证是
.
而不是,
- 不能假定数值前面有空格。
- 可以假设“feet”会写成“ft”或“feet”
- 可以假设小写
- 小数可以是任意长度
- 数字和单词“feet”或“ft”之间可以有任意数量的空格
到目前为止我的尝试:
尝试 1
\b[1-4]{0,1}[0-9]{1,2}(\.[0-9]{1,}}){0,1} {0,}(ft|feet)\b
这很好,但未能考虑小数点并匹配值,如 1000.5 英尺(匹配“5 英尺”)
尝试 2
我的下一个尝试是包含一个否定的后视以确保匹配之前没有 .
或任何数字。
(?<!(\.|[0-9]))([1-4]{0,1}[0-9]{1,2}(\.[0-9]{1,}}){0,1} {0,}(ft|feet))\b
不幸的是,这现在不匹配任何小数(例如,5.5 英尺应该匹配但不匹配)。我怀疑我误解了负面回顾的工作原理。
如果能帮助我理解哪里出了问题,我将不胜感激!
测试用例:
- “1 英尺高”- 匹配
- “1 英尺高”- 匹配
- “1.1 英尺高”- 匹配
- “他有 6 英尺高”- 匹配
- “499.555 英尺高”- 匹配
- “他有 2 m 高”- 不匹配
- “500 英尺高”- 不匹配
- “建筑物高 1000.405 英尺”- 不匹配
最佳答案
你可以使用
r"(?<!\d\.)(?<!\d)(?:[1-9]|[1-9]\d|[1-4]\d\d)(?:\.\d+)?\s*f(?:ee)?t\b"
参见 regex demo
详情
-
(?<!\d\.)(?<!\d)
- 两个否定后视,确保在当前位置之前没有数字+点或只有一个数字 -
(?:[1-9]|[1-9]\d|[1-4]\d\d)
- 一个号码-
[1-9]
- 来自1
至9
-
[1-9]\d
- 来自10
至99
-
[1-4]\d\d
-100
至499
-
-
(?:\.\d+)?
- 一个可选的非捕获组匹配一个可选的点序列,然后是 1+ 个数字 -
\s*
- 0+ 个空格 -
f(?:ee)?t
-ft
或feet
(但不是fet
) -
\b
- 单词边界。
关于python - 正则表达式匹配小于 500 英尺的字符串中的小数位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54260157/