2012-07-02 16 views
2

我在正則表達式中很新,所以我在替換字符串中的數字時感到困惑。如何使用正則表達式替換字符串內部的數字

a="12ab34cde56" 

我想12abXXcde56

b="abc1235ef" 

我想abcXXXXef

c="1ab12cd" 

我想1abXXcd

我想這些來代替它來取代它來取代它在python和php中,但沒有運氣。這是我曾在我的腦海裏:

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

那麼「1f4d6f5」 - >「1fXdXf5」?那麼「1 f 5 g f5 6 h 8」呢? – nhahtdh

+2

你能告訴我們你到目前爲止所嘗試過的嗎?如果你能用自己的代碼指導你,你會學到更多東西。 –

+0

@nhahtdh是的,你是對的,任何不是領先或跟蹤字符串的數字將被X –

回答

1

您可以使用此正則表達式來捕獲所有未開頭或結尾的數字:

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

然後在Python,則可以提供更換匹配的X相應數量的功能。

對於PHP,您可以啓用PREG_OFFSET_CAPTURE來知道匹配的位置,並遍歷匹配列表並處理它們。

注意,上面" 5 ddds"正則表達式將變爲" X ddds"

+0

你有沒有試過這三個字符串的問題? –

+0

@MarcodeWit:謝謝。只用PHP測試過。 – nhahtdh

0

我們代替每組由X的由字符串s非數字(\D)包圍的數字(\d+)。

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

他只替換字母中的那些數字。 –

+0

你的代碼可能會失敗這些輸入:「sdf34」,「4df34df34f34fff8」 – nhahtdh

+0

@nhahtdh好的,解決了 –

0

以下的模式捕獲的字符串中組1,以除去:

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

Demo

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 
>>> 
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)  
+0

請檢查第一個解決方案是否可以正確替換此案例:''4f6g6h7「' – nhahtdh