如何在python中使用多位数通配符来分析使用不同模式的字符串?

2024-10-02 12:27:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前有几千个文件需要解析,每个文件包含一行数据。两个例子:

(CSoc:0.00825830327156463345,(PChapmani:0.00000254996576400768,PPatrius:0.00917039554517301569):0.16367666117488463562,CHaigi:0.00401845774067355072):0.0;

((CSoc:0.00298782818816040099,CHaigi:0.00148583412998809050):0.27857371651571366522,PPatrius:0.00188545323182991121,PChapmani:0.00799482946501124843):0.0;

我的目标是进入每个文件并在“CSoc:”和“PChapmani:”后面的随机浮点数后面插入一个字符串。正如你从这两个例子中看到的,事情是从一个文件重新排列到另一个文件,并且必须保持这种顺序。我尝试使用.split()来执行此操作,但遇到的问题是文件之间的变化太大。例如,有时“CSoc:”或“PChapmani:”后的数字紧跟逗号,有时紧跟括号。我也试过使用正则表达式,但我失败得很惨。。。在

以下是迄今为止我可怜的regex尝试:

^{pr2}$

在这一点上,我甚至没有尝试插入字符串,只是想知道如何根据这些模式来区分字符串的不同部分。在

为了尽可能的清楚,下面是我希望最终得到的结果:

(CSoc:0.00825830327156463345 STRING,(PChapmani:0.00000254996576400768 STRING,PPatrius:0.00917039554517301569):0.16367666117488463562,CHaigi:0.00401845774067355072):0.0;
((CSoc:0.00298782818816040099 STRING,CHaigi:0.00148583412998809050):0.27857371651571366522,PPatrius:0.00188545323182991121,PChapmani:0.00799482946501124843 STRING):0.0;

非常感谢您抽出时间。在


解决方案:

user2289175提供了一个答案(如下所示),虽然我在理解代码方面有一些困难,但它似乎对我很有效。我就是这样实施的:

string = "TESTSTRING"
for file in filelist:
openfile = open(file, "r")
for line in openfile:
    print "1: " + line
    line = re.sub(r"(CSoc:[0-9\.]+)",r"\1 " + string, line)
    line = re.sub(r"(PChapmani:[0-9\.]+)",r"\1 " + string, line)
    print "2: " + line

这为我提供了原始行(1)和新行(2)进行比较。老实说,我只希望在数字后面紧跟着一个“)”时,这个方法能起作用,但它适用于我目前为止所遇到的任何情况。。。以下是一些输出示例:

1: ((PPatrius:0.00204974573878130778,PChapmani:0.00505729864425210219):0.18772783359999054009,CSoc:0.00901378811915975846,CHaigi:0.00000166275543481961):0.0;
2: ((PPatrius:0.00204974573878130778,PChapmani:0.00505729864425210219 TESTSTRING):0.18772783359999054009,CSoc:0.00901378811915975846 TESTSTRING,CHaigi:0.00000166275543481961):0.0;

1: (CSoc:0.00536514757027959765,(PChapmani:0.00160443687004130928,PPatrius:0.00393832871636974006):0.08600185225519103860,CHaigi:0.00555651009595325897):0.0;
2: (CSoc:0.00536514757027959765 TESTSTRING,(PChapmani:0.00160443687004130928 TESTSTRING,PPatrius:0.00393832871636974006):0.08600185225519103860,CHaigi:0.00555651009595325897):0.0;

1: ((PPatrius:0.00448104193048302988,PChapmani:0.00000271124757644997):0.26894791764191683381,CSoc:0.00341363919340215930,CHaigi:0.00000271124757644997):0.0;
2: ((PPatrius:0.00448104193048302988,PChapmani:0.00000271124757644997 TESTSTRING):0.26894791764191683381,CSoc:0.00341363919340215930 TESTSTRING,CHaigi:0.00000271124757644997):0.0;

再次感谢!希望其他人觉得这很有帮助。在


Tags: 文件字符串inforstringline数字例子
1条回答
网友
1楼 · 发布于 2024-10-02 12:27:37

使用python re模块解决您的问题 http://docs.python.org/2/library/re.html

这样的方法应该有效:

for line in infline:
     #re.sub("pattern","replacement", "string")
     line =re.sub(r"([a-zA-Z]+:[0-9\.]+)",r"\1 STRING", line)
     print line

简单地说,使用()将告诉pythonregex匹配括号内的任何正则表达式,并指示组的开始和结束。每个匹配的组都将存储在一个名为\1的特殊运算符中,您可以使用该运算符进行替换。有关正则表达式语法的更多信息,请查看上面的链接。在

干杯!在

相关问题 更多 >

    热门问题