我有一个文件,模式文本就像(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)
答案 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)'