0

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

3 回答 3

1

您正在寻找的是搜索组(例如,参见命名捕获组)。

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

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

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

于 2013-10-22T06:37:10.180 回答
1

更简单的正则表达式:

>>> import re
>>> '(' + ','.join(re.findall(r'[,\(]([^:]*):', s)) + ')'
'(1A0IA,1AYLA)'
于 2013-10-22T06:50:57.193 回答
0

看看这个:

import re
s = "(1A0IA:0.42722,1AYLA:0.47152)"
r = "([\d\w]{5}):[\d\.]+(,|\))"
re.sub(r, r'\1\2', s)
# '(1A0IA, 1AYLA)'
于 2013-10-22T06:42:39.283 回答