我有一些%的情况如下-
12.02
16.59
81.61%
45
24.812
51.35
19348952
88.22
0
000
021
.85%
100
我想匹配除大于100以外的所有百分比类型。预期的输出:
12.02
16.59
81.61
45
24.812
51.35
88.22
0
000
21
.85
100
我已经尝试过(分数百分比的正则表达式)。但是这个没有得到我想要的所有情况。此外,我正在用空字符串替换不匹配。我的python代码是这样的-
pattern=r'(b(?<!.)(?!0+(?:.0+)?%)(?:d|[1-9]d|100)(?:(?<!100).d+)?$)'
df['Percent']=df['Percent'].astype(str).str.extract(pattern)[0]
许多谢谢。
编辑:解决方案(由@rv.kvetch)匹配除了0以外的大多数边缘情况,但我可以使用该限制。原帖子要求不匹配0大小写或0%
如果您愿意,您可以不使用regex。
nums = ['12.02'
'16.59',
'81.61%',
'45',
'24.812',
'51.35',
'19348952',
'88.22',
'0',
'000',
'021',
'.85%',
'100']
for n in nums:
x = n.sptrip('%')
x = int(x)
if x <= 100:
print(n)
我可能非常接近,但看起来这是为我工作到目前为止:
^(?:0{0,})((?:[1-9]{1,2}|100)?(?:.d+)?)%?$
Regex演示
描述
第一个非捕获组
(?:0{0,})
-匹配前导0的非捕获组,出现0次或多次
第一个捕获组
(?:[1-9]{1,2}|100)?
-可选的,非捕获组,匹配数字1-9
一到两次,基本上覆盖范围1-99。然后是或条件,所以我们也覆盖100。?
将此组设置为可选的,以涵盖像。24这样的情况,这仍然是一个有效的百分比。(?:.d+)?
-可选的,非捕获组,匹配小数部分,例如.123
。这是可选的,因为像20这样的数字本身就是有效的百分比值。
最后一个非捕获组
%?
-最后,在这里我们匹配可选的末尾百分比(%)符号,可以出现在末尾。
更新下面是一个非正则表达式方法,它应该比正则表达式方法更有效。这也涵盖了像.0
这样的边缘情况,即regex目前还没有更新以处理:
string = """
12.02
16.59
81.61%
45
24.812
51.35
19348952
88.22
0
000
.0%
021
.85%
100
150
1.2.3
hello world
"""
for n in string.split('n'):
try:
x = float(n.rstrip('%'))
except ValueError: # invalid numeric value
continue
# Check if number is in the range 0..100 (non-inclusive of 0)
if 0 < x <= 100:
print(x)