如何通过给定原始和返回字符串的关系来替换字符串?

时间:2013-10-22 06:00:32

标签: python regex python-3.x

我有一个文件,模式文本就像(1A0IA:0.42722,1AYLA:0.47152)。我想将其替换为(1A0IA,1AYLA)

我知道我可以这样做:

text是包含(1A0IA:0.42722,1AYLA:0.47152)

的字符串
expression 1 : reduced_text = re.sub(r':\d+\.\d+\,',r',',text) 
output : (1A0IA,1AYLA:0.47152)
expression 2 : reduced_text = re.sub(r':\d+\.\d+\)',r')',reduced_text) 
output : (1A0IA,1AYLA)

我希望仅在:float,中替换模式(ID:float,ID:float),但是存在一些包含:float,但不包含在此类字符串中的文字:(ID:float,ID:float)

是否存在可以执行以下操作的表达式?

(string1:0.42722,string2:0.47152) -> (string1,string2)

第一个.{5}string 1;第二个.{5}string 2

reduced_text = re.sub(r'\(.{5}:\d+\.\d+\,.{5}:\d+\.\d+\)',r'\(.{5}\,.{5}\)',text)

3 个答案:

答案 0 :(得分:1)

您要查找的是搜索组(例如参见 Named Capturing Groups )。

通过这些,您可以执行以下操作来获取您的ID。

re.findall('(?P<id1>.{5}):[\d\.]+,(?P<id2>.{5}):[\d\.]+', text)

实际上没有必要为捕获组命名,因此(.{5})...就足够了。

答案 1 :(得分:1)

更简单的正则表达式:

>>> import re
>>> '(' + ','.join(re.findall(r'[,\(]([^:]*):', s)) + ')'
'(1A0IA,1AYLA)'

答案 2 :(得分:0)

看看这个:

import re
s = "(1A0IA:0.42722,1AYLA:0.47152)"
r = "([\d\w]{5}):[\d\.]+(,|\))"
re.sub(r, r'\1\2', s)
# '(1A0IA, 1AYLA)'