具有正则表达式的数值范围 python
Numeric Ranges with a Regular Expression python
所以我正在处理一个文本分析问题,我试图用 Python 中的正则表达式删除 0 到 999 之间的所有数字。我已经尝试使用 Regex Numeric Range Generator 来获取正则表达式,但没有成功。我只能删除所有数字。
我试过几个正则表达式,但都没有用。这是我试过的
# Remove numbers starting from 0 ==> 999
data_to_clean = re.sub('[^[0-9]{1,3}$]', ' ', data_to_clean)
我也试过这个:
# Remove numbers starting from 0 ==> 999
data_to_clean = re.sub('\b([0-9]|[1-8][0-9]|9[0-9]|[1-8][0-9]{2}|9[0-8][0-9]|99[0-9])\b', ' ', data_to_clean)
这个:
^([0-9]|[1-8][0-9]|9[0-9]|[1-8][0-9]{2}|9[0-8][0-9]|99[0-9])$
还有这个:
def clean_data(data_to_clean):
# Remove numbers starting from 0 ==> 999
data_to_clean = re.sub('[^[0-9]{1,3}$]', ' ', data_to_clean)
return data_to_clean
我有很多数字,但我只需要删除小数点后 3 位的数字并保留其他数字。
感谢您的帮助
我认为您可以结合使用带有单词边界的尝试 (\b
) 和最后一次尝试 ([0-9]{1,3}
)。
因此生成的正则表达式应如下所示:\b[0-9]{1,3}\b
如果您查看演示:regex101。com/r/qDrobh/6
它应该替换所有 1 位、2 位和 3 位数字,并忽略更高的数字和其他单词。
从 0 到 999 的数字是
- 单个字符[0-9]
- 两个字符[1-9][0-9]
- 三个字符[1-9][0-9][0-9]
这给出了一个天真的正则表达式 /\b(?:[0-9]|[1-9][0-9]|[1-9][0-9][0-9])\b/
但是我们在选项中有重复的字符 类 所以我们可以将它们分解出来
/(?!\b0[0-9])\b[0-9]{1,3}\b/
它的工作原理是使用否定先行 (?!\b0[0-9])
检查单词的开头,然后是 0,然后是数字以忽略 01 等,然后查找 1 到三个 0 - 9 字符。因为否定前瞻需要至少 2 个字符,所以单个 0
仍然有效。
您需要在模式字符串前面加上 r
以防止转义,这样 interpeter 就不会用退格键交换 \b
。另外,您可以像这样简化模式:
data_to_clean = re.sub(r'\b([0-9]|[1-9][0-9]{1,2})\b', ' ', data_to_clean)
所以我正在处理一个文本分析问题,我试图用 Python 中的正则表达式删除 0 到 999 之间的所有数字。我已经尝试使用 Regex Numeric Range Generator 来获取正则表达式,但没有成功。我只能删除所有数字。
我试过几个正则表达式,但都没有用。这是我试过的
# Remove numbers starting from 0 ==> 999
data_to_clean = re.sub('[^[0-9]{1,3}$]', ' ', data_to_clean)
我也试过这个:
# Remove numbers starting from 0 ==> 999
data_to_clean = re.sub('\b([0-9]|[1-8][0-9]|9[0-9]|[1-8][0-9]{2}|9[0-8][0-9]|99[0-9])\b', ' ', data_to_clean)
这个:
^([0-9]|[1-8][0-9]|9[0-9]|[1-8][0-9]{2}|9[0-8][0-9]|99[0-9])$
还有这个:
def clean_data(data_to_clean):
# Remove numbers starting from 0 ==> 999
data_to_clean = re.sub('[^[0-9]{1,3}$]', ' ', data_to_clean)
return data_to_clean
我有很多数字,但我只需要删除小数点后 3 位的数字并保留其他数字。
感谢您的帮助
我认为您可以结合使用带有单词边界的尝试 (\b
) 和最后一次尝试 ([0-9]{1,3}
)。
因此生成的正则表达式应如下所示:\b[0-9]{1,3}\b
如果您查看演示:regex101。com/r/qDrobh/6 它应该替换所有 1 位、2 位和 3 位数字,并忽略更高的数字和其他单词。
从 0 到 999 的数字是
- 单个字符[0-9]
- 两个字符[1-9][0-9]
- 三个字符[1-9][0-9][0-9]
这给出了一个天真的正则表达式 /\b(?:[0-9]|[1-9][0-9]|[1-9][0-9][0-9])\b/
但是我们在选项中有重复的字符 类 所以我们可以将它们分解出来
/(?!\b0[0-9])\b[0-9]{1,3}\b/
它的工作原理是使用否定先行 (?!\b0[0-9])
检查单词的开头,然后是 0,然后是数字以忽略 01 等,然后查找 1 到三个 0 - 9 字符。因为否定前瞻需要至少 2 个字符,所以单个 0
仍然有效。
您需要在模式字符串前面加上 r
以防止转义,这样 interpeter 就不会用退格键交换 \b
。另外,您可以像这样简化模式:
data_to_clean = re.sub(r'\b([0-9]|[1-9][0-9]{1,2})\b', ' ', data_to_clean)