我在正则表达式方面很新,所以我在替换字符串中的数字时感到困惑。
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"
我们将字符串 s 中\d+
由非数字 ( ) 包围的每一组数字 ( ) 替换为's 。\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
>>>
stock 模块的唯一可能性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)