将sed正则表达式转换为python代码

时间:2014-11-18 03:44:20

标签: python regex sed

我可以理解以下sed正则表达式。

 sed 's/.*\(SNAP=[^|]*\) |.*/\1/' | sort | uniq -c > $log.snaps

我的任务是将此bash行转换为Python代码。什么是最好的方法呢? 只需使用上面的 cmd 调用os.system(cmd)? 或者使用Python re模块? 任何伪代码都是最受欢迎的。 :)

1 个答案:

答案 0 :(得分:2)

你问了最好的方法,我只是给你一个简单的方法。你当然可以优化它。 但是,仍然需要使用约束进行测试,因为调用shell需要一些时间 值得注意的是,shell中的管道可能是获得更快代码的好方法,因为sed可以在等待cat完成时开始工作。 sort也可以开始工作,但显然只有在sed工作完成后才会输出。因此,这是在您的IO期间使用CPU的好方法,应被视为低成本/良好性能解决方案。
我试过一个简单的例子,但你会明白这个想法:

test

love
lol
loki
loki
ki
loutre
poutre

简单的bash命令,看起来像你的:

cat test | sed 's/lo\(.*\)$/\1/' | sort | uniq

输出:

ki
l
poutre
utre
ve

现在让我们尝试在python中执行相同的操作:

#!/usr/bin/python

import re

s = """love
lol
loki
loki
ki
loutre
poutre"""

arr = s.split('\n')                                             # sed iterates on each line
arr = map((lambda line: re.sub(r'lo(.*)$', r'\1', line)), arr)  # sed
arr = set(arr)                                                  # uniq
arr = sorted(list(arr))                                         # sort

print '\n'.join(arr)                                            # output it

这也可以用丑陋的代码编写:

print '\n'.join(sorted(list(set(map((lambda line: re.sub(r'lo(.*)$', r'\1', line)), s.split('\n'))))))