python - 正则表达式匹配小于 500 英尺的字符串中的小数位

标签 python regex

我正在尝试使用正则表达式来确定字符串是否包含小于 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] - 来自 19
    • [1-9]\d - 来自 1099
    • [1-4]\d\d - 100499
  • (?:\.\d+)? - 一个可选的非捕获组匹配一个可选的点序列,然后是 1+ 个数字
  • \s* - 0+ 个空格
  • f(?:ee)?t - ftfeet (但不是 fet )
  • \b - 单词边界。

关于python - 正则表达式匹配小于 500 英尺的字符串中的小数位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54260157/

相关文章:

Python/Collections - 删除出现相同次数的元素

python - 防止注释显示在图形区域之外

python - 如何在 Python 中获得 XMPP 客户端的响应

python - 通过Python中的正则表达式多次搜索字符串中的模式

Python - 合并列表中的一行列表

python - 如何使用请求模块跳过连接超时 url

javascript - 应用 regEx 后获取 javascript 数组中的值

javascript - 如何调整我的正则表达式以仅替换缩写而不替换扩展?

javascript - 正则表达式合并电子邮件和号码,但不合并链接

javascript - JS 正则表达式替换不起作用