私は正規表現に慣れていないので、文字列内の数字を置き換える際に混乱しています。
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"
ストック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+
非数字 ( ) で囲まれた数字 ( )のすべてのグループを'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"
、または文字列の数字の間にアルファベット文字が 1 つしかない場合には機能しません。
正規表現を 1 つではなく 2 つ使用しても問題ない場合。次のコードは、u に対して機能するはずです。
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
>>>