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

时间:2014-03-07 03:15:55

标签: python regex pattern-matching wildcard

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

(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:”之后的数字后面会紧跟一个逗号,有时紧接着是括号。我也试过使用正则表达式,但我失败了......

到目前为止,这是我可怜的正则表达式尝试:

for line in infile:
    print line
    r = re.compile('CSoc:(\d+).(\d+),')
    print r.split(line)

此时我甚至都没有尝试插入字符串,只是试图找出如何根据这些模式区分字符串的不同部分。

为了尽可能清楚,这是我最终希望得到的:

(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;

非常感谢你的时间。


SOLUTION:

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;

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

1 个答案:

答案 0 :(得分:0)

使用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

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

干杯!