正则表达式有限制地替换

时间:2019-01-04 03:13:58

标签: python regex

我正在尝试在字符串末尾替换LIMIT X。这是我现在所拥有的:

>>> re.sub(r'limit\s{1,}(\d{1,})\s+?$', '20', 'select * from entity limit 1000\r\n', flags=re.IGNORECASE)
'select * from entity limit 1000'

但是,似乎我没有获得正确的正则表达式。什么是正确的正则表达式?请注意,通过执行str.split('limit')并从那里开始,可以更轻松地完成此操作,但是对于这个问题,我需要使用正则表达式。

2 个答案:

答案 0 :(得分:1)

>>> re.sub(r'(\s+limit)\s+(\d+)\s+?$', r"\1 20" , 'select * from entity limit 1000\r\n', flags=re.IGNORECASE)
'select * from entity limit 20\n'

经过2.7.13和3.7.2的测试。
\1是要匹配的" limit"部分,r前的"\1 20"很重要。
如果仍有问题,请发表评论。
(并且请说明您的系统和python版本等)

答案 1 :(得分:0)

寻求帮助时,请务必记住要provide detailsminimal example清楚地说明您要做什么。

我假设您有一组查询,并且您想删除限制以使查询返回完整结果,并且您想在末尾保留空白(这对于执行查询可能很重要)

我已经在python 2.7.15rc13.6.6中测试过的工作示例:

import re
query = 'select * from entity limit 1000\r\n'
regex = r'\s+limit\s+\d+(\s*)$'
replacement = '\\1'
re.sub(regex, replacement, query, flags=re.IGNORECASE)

您的正则表达式中的错误是,您在另一个量词(?之后有一个可选的量词(+),但是一个量词之前必须有一个原子。

您也可以将不需要的量词{1,}替换为等效形式+

在示例\\1中使用的替换项是在正则表达式上捕获的组(括号之间的组)。

在说明之前,我还添加了一个强制性的空格分隔符,以使结果看起来更优美。

您可以了解正则表达式for python3python2(第7章)。