【问题标题】:What's wrong with this Perl regular expression?这个 Perl 正则表达式有什么问题?
【发布时间】:2010-04-15 01:53:18
【问题描述】:

我有这样的台词

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

【问题讨论】:

标签: regex perl


【解决方案1】:

你已经接近了,你的正则表达式的结尾失败了,因为它需要在指数之前有空格。试试这个:

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

【讨论】:

  • @neversaint => 我忘记了x 修饰符,因为我在正则表达式中添加了空间以使其更具可读性。立即尝试
【解决方案2】:

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

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

正则表达式匹配字符串的 (e=num^exponent,) 部分,同时捕获 num^exponent(在 $1 中),然后用 $1 替换整个匹配项。

【讨论】:

  • 您的正则表达式没有返回所需的结果。这样做: $line =~ s/^(\w+) .+? = ([^,]+) , .+/$1 - $2/x
  • 哦,我忽略了所需的“-”插入。为此,只需在 $1 之前添加“-”(以及格式化所需的任意数量的空格)。我将编辑我的答案以反映这一点。顺便说一句,您捕获不需要修改的文本的方法效率较低。只关注需要更换的东西就足够了。感谢您的更正 -)。
  • "...获取文本的方法..." 如果你的意思是用 "^" 锚定,你可以通过锚定获得很多速度,无论是在模式的开始还是结束。我对一些不同的搜索方式进行了基准测试,包括使用 index(),它帮助很大。
  • 不,我的意思是只关注要修改的字符串部分。这是几个正则表达式相关文本中的常见建议。对于这种情况,您的正则表达式会尝试匹配前面的文本( e=...)。在进行替换时,只关注 ( e=...) 部分就足够了。捕获所需的文本,然后将其替换为我们想要的文本。请尝试给定的正则表达式,它确实有效。话虽如此,我确实同意您的观点,即提供 ^、$ 等锚点可以提高性能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多