我的文件中出现了多次这样的字符串:
%na^me%
%name^%
%^name%
....
我想在我的文件中搜索这样的每个字符串,并在分析字符串后替换它。 例如
string `%^name%` will be replaced `Data`
string `%name^%` will be replaced with `DATA`
....
要查找我的子字符串,我将此函数与regex一起使用
re.findall('(?<=\%)(.*?)(?=\%)', data)
它发现子串很好。但如何更换它们?
我看到的解决方案是创建地图并迭代以用一些值替换每一个事件。
但是有更好的方法吗?
答案 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%'