Regex匹配所有类型的百分比



我有一些%的情况如下-

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)

最新更新