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


How to replace numbers inside of a string using Regular Expression

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

a="12ab34cde56" 

我想用12abXXcde56替换它

b="abc1235ef"

我想用abcXXXXef替换它

c="1ab12cd"

我想用1abXXcd替换它

我正在尝试使用python和php,但没有运气。这是我的想法:

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

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

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

然后在 Python 中,你可以提供一个函数,用相应的X数替换匹配项。

对于 PHP,您可以让PREG_OFFSET_CAPTURE知道匹配的位置,并循环查看匹配列表并处理它们。

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

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

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

演示。

库存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)

使用更高级的正则表达式模块,您可以使用可变宽度的环形断言:

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

我们将字符串 s 中每组被非数字 ('D) 包围的数字 ('d+) 替换为 X 的。

re.sub(r'(?<='D)'d+(?='D)',lambda match : 'X' * len(match.group(0)) , s)
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
>>>