首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用regex标识4到5个数字(连续的,即不包括空格或特殊字符),而不包括前面的0's。

使用regex标识4到5个数字(连续的,即不包括空格或特殊字符),而不包括前面的0's。
EN

Stack Overflow用户
提问于 2018-07-10 13:50:22
回答 1查看 62关注 0票数 1

我试图使用正则表达式来识别4到5位数字。下面的代码在所有情况下都是有效的,除非在一个1、2或3位数字之前有连续的0。我不希望'0054‘、'0008’或'0009‘是一个匹配,但我希望'10354’或'10032',或'9005',或'9000‘都是匹配的。是否有一种使用正则表达式来实现此功能的好方法?以下是我当前的代码,它适用于大多数情况,除非前面有长度小于4或5个字符的一系列数字。

代码语言:javascript
运行
复制
import re

line = 'US Machine Operations | 0054'
match = re.search(r'\d{4,5}', line)
if match is None:
    print(0)
else:
    print(int(match[0]))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-10 13:52:56

你可以用

代码语言:javascript
运行
复制
(?<!\d)[1-9]\d{3,4}(?!\d)

regex演示

注意事项:在Pandas str.extract中,必须用捕获组(一对未转义括号)包装要返回的部分。所以,你需要用

代码语言:javascript
运行
复制
(?<!\d)([1-9]\d{3,4})(?!\d)
       ^            ^

示例:

代码语言:javascript
运行
复制
df2['num_col'] = df2.Warehouse.str.extract(r'(?<!\d)([1-9]\d{3,4})(?!\d)', expand = False).astype(float)

仅仅因为您可以简单地使用捕获组,就可以使用等效的regex:

代码语言:javascript
运行
复制
(?:^|\D)([1-9]\d{3,4})(?!\d)

详细信息

  • (?<!\d) -左边没有数字
  • (?:^|\D) -字符串或非数字字符的开始(使用非捕获组,以便在模式中只能容纳一个捕获组,并让str.extract只提取需要提取的内容)。
  • [1-9] -一个非零的数字
  • \d{3,4} -三或四位数
  • (?!\d) -不允许右边的数字

Python演示

代码语言:javascript
运行
复制
import re
s = "US Machine Operations | 0054 '0054','0008',or '0009' to be a match, but i would want '10354' or '10032', or '9005', or '9000'"
print(re.findall(r'(?<!\d)[1-9]\d{3,4}(?!\d)', s))
# => ['10354', '10032', '9005', '9000']
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51267040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档