我正在尝试仅提取有效的百分比信息,并使用python中的正则表达式从字符串中消除任何不正确的表示。该功能应该像这样工作, 为,
0-100% = TRUE
0.12% = TRUE
23.1245467% = TRUE
9999% = FALSE
8937.2435% = FALSE
7.% = FALSE
我已经检查了一些堆栈溢出的解决方案,它只提取0-100%。我尝试了以下解决方案,
('(\s100|[123456789][0-9]|[0-9])(\.\d+)+%')
'(\s100|\s\d{1,2})(\.\d+)+%'
'(\s100|\s\d[0-99])(\.\d+)+%'
除了0-99%(给出FALSE)和12411.23526%(给出TRUE)之外,所有这些都适用于所有其他可能性。空间的原因是我想只提取两位数字。
答案 0 :(得分:1)
想出来。问题在'+'
表达式'(\.\d+)+'
中,而应该是'(\.\d+)*'
。第一个表达式期望具有任何两位数百分比值的十进制值,而第二个表达式不具有。我的最终版本如下。
'\s(100|(\d{1,2}(\.\d+)*))%'
您可以将\s
替换为$
,以获取句子开头的百分比值。此外,我的问题部分中的版本接受100的十进制值,这是无效的百分比值。
答案 1 :(得分:0)
考虑到正则表达式之后的所有可能性。
如果你忽略了?:
,即非捕获组正则表达式并不那么令人生畏。
正则表达式: ^(?:(?:\d{1,2}(?:\.\d+)?\-)?(?:(?:\d{1,2}(?:\.\d+)?)|100))%$
<强>解释强>
(?:(?:\d{1,2}(?:\.\d+)?\-)?
符合下限(如果有),例如0-100%
的可选小数部分。
(?:(?:\d{1,2}(?:\.\d+)?)|100)
符合上限,或者只有限制为100
且带有可选小数部分的单个数字。
<强> Regex101 Demo 强>
在字符串中匹配此类匹配项的同一正则表达式的另一个版本是删除锚^
和$
并检查开头的非数字。
正则表达式: (?<=\D|^)(?:(?:\d{1,2}(?:\.\d+)?\-)?(?:(?:\d{1,2}(?:\.\d+)?)|100))%
<强> Regex101 Demo 强>
答案 2 :(得分:0)
我不会单独依赖正则表达式 - 它并不意味着首先过滤范围 最好在字符串中查找候选者,然后以编程方式对其进行分析,如下所示:
import re
string = """
some gibberish in here 0-100% = TRUE
some gibberish in here 0.12% = TRUE
some gibberish in here 23.1245467% = TRUE
some gibberish in here 9999% = FALSE
some gibberish in here 8937.2435% = FALSE
some gibberish in here 7.% = FALSE
"""
numbers = []
# look for -, a digit, a dot ending with a digit and a percentage sign
rx = r'[-\d.]+\d%'
# loop over the results
for match in re.finditer(rx, string):
interval = match.group(0).split('-')
for number in interval:
if 0 <= float(number.strip('%')) <= 100:
numbers.append(number)
print numbers
# ['0', '100%', '0.12%', '23.1245467%']