我试图使用正则表达式来识别4到5位数字。下面的代码在所有情况下都是有效的,除非在一个1、2或3位数字之前有连续的0。我不希望'0054‘、'0008’或'0009‘是一个匹配,但我希望'10354’或'10032',或'9005',或'9000‘都是匹配的。是否有一种使用正则表达式来实现此功能的好方法?以下是我当前的代码,它适用于大多数情况,除非前面有长度小于4或5个字符的一系列数字。
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]))发布于 2018-07-10 13:52:56
你可以用
(?<!\d)[1-9]\d{3,4}(?!\d)见regex演示。
注意事项:在Pandas str.extract中,必须用捕获组(一对未转义括号)包装要返回的部分。所以,你需要用
(?<!\d)([1-9]\d{3,4})(?!\d)
^ ^示例:
df2['num_col'] = df2.Warehouse.str.extract(r'(?<!\d)([1-9]\d{3,4})(?!\d)', expand = False).astype(float)仅仅因为您可以简单地使用捕获组,就可以使用等效的regex:
(?:^|\D)([1-9]\d{3,4})(?!\d)详细信息
(?<!\d) -左边没有数字(?:^|\D) -字符串或非数字字符的开始(使用非捕获组,以便在模式中只能容纳一个捕获组,并让str.extract只提取需要提取的内容)。[1-9] -一个非零的数字\d{3,4} -三或四位数(?!\d) -不允许右边的数字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']https://stackoverflow.com/questions/51267040
复制相似问题