2010-04-15 70 views
0

我有一个行这样这个Perl正则表达式有什么问题?

NF419andZNF773 (e=10^-92,). 
ZNF571 (e=2 10^-14,) 

什么是正则表达式,用于提取上述结果,这样它给

NF419andZNF773 - 10^-92 
ZNF571 - 2 10^-14 

我试过,但失败。

$line =~ /(\w+)\s\(e=\s(.*),\)/; 
print "$1 - $2\n"; 
+0

可能的重复http://stackoverflow.com/questions/2642149/converting-numeric-string-into-perls-processable-number – 2010-04-15 09:45:44

回答

4

你很接近,你的正则表达式的结尾是失败的,因为它期望指数前的空格。试试这个:

$line =~/(\w+) \s+ \(e= ([^,]+) /x; 
+0

@ES:似乎没有工作。 – neversaint 2010-04-15 02:01:31

+1

@neversaint =>我忘记了'x'修饰符,因为我在正则表达式中增加了空间,使它更具可读性。现在试试 – 2010-04-15 02:03:11

+0

感谢百万埃里克。 – neversaint 2010-04-15 02:05:45

0

其实你可以做这一切正则表达式,尝试

$line =~ s/\(\s*e\s*=\s*([^,]+),\)/-$1/ 

正则表达式匹配(E = NUM​​ ^指数)的字符串的一部分,虽然这样做,它抓住了num^exponent(在$ 1中),然后用$ 1替换整个匹配。

+1

您的正则表达式没有返回所需的结果。这将做到这一点:$ line =〜s/^(\ w +)。+? =([^,] +),。+/$ 1 - $ 2/x – 2010-04-15 10:48:19

+0

哦,我忽略了所需的' - '插入。要做到这一点,只需在$ 1之前添加' - '(并根据需要为格式设置尽可能多的空格)。我会编辑我的答案以反映这一点。顺便说一句,你不需要修改文本的方法效率较低。仅仅关注你需要替换的东西就足够了。感谢修正虽然 - )。 – Jasmeet 2010-04-15 17:55:57

+0

“...捕获文本的方法...”如果你的意思是用“^”锚定,你可以通过锚定获得很多速度,无论是在模式的开始还是结束。我在一些不同的搜索方式上做了基准测试,包括做index(),这对我有很大的帮助。 – 2010-04-27 19:57:49