搜索子串并在分析后替换它们

时间:2015-01-09 11:49:34

标签: python

我的文件中出现了多次这样的字符串:

%na^me%
%name^%
%^name%
....

我想在我的文件中搜索这样的每个字符串,并在分析字符串后替换它。 例如

string `%^name%` will be replaced `Data`
string `%name^%` will be replaced with `DATA`
....

要查找我的子字符串,我将此函数与regex一起使用

re.findall('(?<=\%)(.*?)(?=\%)', data)

它发现子串很好。但如何更换它们?

我看到的解决方案是创建地图并迭代以用一些值替换每一个事件。

但是有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

你不需要去re.findall。只需re.sub即可。

>>> s = '''%na^me%
%name^%
%^name%'''
>>> m = re.sub(r'(?<=%)\^.*?(?=%)', r'Data', s)
>>> f = re.sub(r'(?<=%).*?\^(?=%)', r'DATA', m)
>>> print(f)
%na^me%
%DATA%
%Data%

更新

>>> m = re.sub(r'(?<=%)\^.*?(?=%)', r'Data', s)
>>> f = re.sub(r'(?<=%).*?\^(?=%)', r'DATA', m)
>>> j = re.sub(r'(?<=%).*?.\^..*(?=%)', r'datA', f)
>>> print(j)
%datA%
%DATA%
%Data%

如果您还要替换%,可以试试这个,

>>> m = re.sub(r'%\^.*?%', r'Data', s)
>>> f = re.sub(r'%.*?\^%', r'DATA', m)
>>> j = re.sub(r'%.*?.\^..*%', r'datA', f)
>>> print(j)
datA
DATA
Data

答案 1 :(得分:1)

您可以使用以下模式,请注意您需要使用^转义\。相反,您可以使用分组。如果您希望python将模式解释为正则表达式格式,则需要在模式之前使用r

>>> s="""%na^me%
... %name^%
... %^name%"""
>>> l= re.findall(r'%([a-zA-Z\^]+)%',s)
['na^me', 'name^', '^name']

并且要替换字符串,您可以使用如下字典,并将您的模式替换为str.replace()

>>> d={'^name':'Data','name^':'DATA','na^me':'DAta'}
>>> for i in l :
...   s=s.replace(i,d[i])
... 
>>> s
'%DAta%\n%DATA%\n%Data%'