如何使用正则表达式替换字符串内的数字

时间:2012-07-02 09:34:27

标签: php python regex string

我是正则表达式的新手,所以我在替换字符串中的数字时感到困惑。

a="12ab34cde56" 

我想用12abXXcde56

替换它
b="abc1235ef"

我想用abcXXXXef

替换它
c="1ab12cd"

我想用1abXXcd

替换它

我正在尝试python和php中的那些,但没有运气。这就是我的想法:

^([0-9]+)([a-z]+)(.*)([a-z]+)([0-9]+)$

5 个答案:

答案 0 :(得分:1)

您可以使用此正则表达式捕获所有不在前导或尾随的数字:

(?<!^|\d)\d+(?!$|\d)

然后在Python中,您可以提供一个函数来替换相应数量为X的匹配。

对于PHP,您可以启用PREG_OFFSET_CAPTURE来了解匹配的位置,并遍历匹配列表并处理它们。

请注意,上面" 5 ddds"的正则表达式将更改为" X ddds"

答案 1 :(得分:0)

我们用\d+代替字符串s中的非数字(\D)所包围的每个数字组(X)。

re.sub(r'(?<=\D)\d+(?=\D)',lambda match : 'X' * len(match.group(0)) , s)

答案 2 :(得分:0)

以下模式捕获要在组1中删除的字符串:

^.*[a-z]+(\d+)[a-z]+.*$

Demo

答案 3 :(得分:0)

import re
re1 = re.compile("([\d]*[a-zA-Z])([\d\w]+)([a-zA-Z][\d]*)")
re2 = re.compile("([\d])")

s = "4f6g6h7"
def x(matchobj):
    return ''.join([matchobj.groups()[0],
        re2.sub('X', matchobj.groups()[1]), matchobj.groups()[2]])

print re1.sub(x, s)

更新:原始方法不适用于案例"4f6g6h7"或任何字符串在数字之间只有一个字母字符。

如果使用两个正则表达式而不是一个是可接受的。以下代码适用于您。

import re
re1 = re.compile("([\d]*[a-zA-Z])([\d\w]+)([a-zA-Z][\d]*)")
re2 = re.compile("([\d])")

s = ['12ab34cde56', "abc1235ef","1ab12cd", "4f6g6h7"]

def x(matchobj):
    return ''.join([matchobj.groups()[0],
        re2.sub('X', matchobj.groups()[1]), matchobj.groups()[2]])

for ss in s:
    print ss, '->', re1.sub(x, ss)

>>>
12ab34cde56 -> 12abXXcde56
abc1235ef -> abcXXXXef
1ab12cd -> 1abXXcd
4f6g6h7 -> 4fXgXh7
>>> 

答案 4 :(得分:0)

库存re模块的唯一可能性似乎是替换功能,例如:

xs = ["12ab34cde56", "abc1235ef", "1ab12cd"]

import re
for x in xs:
    print x, re.sub(r'(\D)(\d+)(\D)', lambda m: m.group(1) + 'X' * len(m.group(2)) + m.group(3), x)

使用更高级的regex模块,您可以使用可变宽度的外观断言:

import regex
for x in xs:
    print x, regex.sub(r'(?<=\D\d*)\d(?=\d*\D)', 'X', x)