2

私は正規表現に慣れていないので、文字列内の数字を置き換える際に混乱しています。

a="12ab34cde56" 

で置き換えたい12abXXcde56

b="abc1235ef"

で置き換えたいabcXXXXef

c="1ab12cd"

で置き換えたい1abXXcd

私はpythonとphpでそれらを試していますが、運がありません。これが私の心にあったものです:

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

5 に答える 5

1

この正規表現を使用して、先頭または末尾以外のすべての数字をキャプチャできます。

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

次に、Python で、一致を対応する の数に置き換える関数を提供できますX

PHP の場合、PREG_OFFSET_CAPTURE を有効にして一致の位置を認識し、一致のリストをループして処理することができます。

上記の正規表現では、次のよう" 5 ddds"に変更されることに注意してください。" X ddds"

于 2012-07-02T09:46:01.840 に答える
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)

より高度な正規表現モジュールを使用すると、可変幅のルックアラウンド アサーションを使用できます。

import regex
for x in xs:
    print x, regex.sub(r'(?<=\D\d*)\d(?=\d*\D)', 'X', x)    
于 2012-07-02T10:08:35.943 に答える
0

次のパターンは、グループ 1 で削除する文字列をキャッチします。

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

デモ

于 2012-07-02T09:45:49.977 に答える
0

文字列 s 内の\d+非数字 ( ) で囲まれた数字 ( )のすべてのグループを'sで置き換えます。\DX

re.sub(r'(?<=\D)\d+(?=\D)',lambda match : 'X' * len(match.group(0)) , s)
于 2012-07-02T09:38:34.133 に答える
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"、または文字列の数字の間にアルファベット文字が 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
>>> 
于 2012-07-02T09:51:05.420 に答える