" sed -f" python中的bash命令等价物

时间:2014-04-03 08:26:35

标签: python regex bash file sed

我在文件(sed.clean)中有一组正则表达式替换,如下所示:

#!/bin/sed -f
s/https\?:\/\/[^ ]*//g
s/\.//g
s/\"//g
s/\,//g
y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/

还有更多那样的线条。 我想用这个文件来“清理”一组文本文件。 要在bash中执行此操作,我会执行以下操作:

for file in $(ls rootDirectory)
do
    sed -f sed.clean $file > OUTPUT_FILE
done

我怎样才能在Python中做类似的事情?

我的意思是,是否可以利用 sed.clean 文件中的 n RE(或以适当的Python格式重写它们)为了避免构建嵌套循环以将每个文件与每个RE进行比较,只需将每个文件与 sed.clean python文件进行比较,就像我在bash中一样。 像这样:

files = [ f for f in listdir(dirPath) if isfile(join(dirPath,f)) ]
for file in files:
    newTextFile = re.sub(sed.clean, file)
    saveTextFile(newTextFile, outputPath)

而不是:

REs = ['s/https\?:\/\/[^ ]*//g', 's/\.//g',...,'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/']
files = [ f for f in listdir(dirPath) if isfile(join(dirPath,f)) ]
for file in files:
    for re in REs:
        newTextFile = re.sub(re, '', file)
        saveTextFile(newTextFile, outputPath)

谢谢!

3 个答案:

答案 0 :(得分:0)

这些sed模式似乎会删除与文件中某些模式匹配的行。 在python readlines()中,filter()re.sub()将是您的最佳选择。

答案 1 :(得分:0)

尝试像这样的re.sub:

import re
>>> re.compile(r'\.')
<_sre.SRE_Pattern object at 0x9d48c80>
>>> MY_RE = re.compile(r'\.')
>>> MY_RE.sub('','www.google.com')
'wwwgooglecom'

您可以在re.compile()

中编译任何正则表达式

答案 2 :(得分:0)

您必须将sed脚本替换转换为Python等效。


s/<pattern>/<replacement>/<flags>
# is equivialent to
re.sub("<pattern>", "<replacement>", <input>, flags=<python-flags>)

请注意,这是贪婪的,所以在模式结束时不需要/g。此外,您不应在模式中包含滞后,因为它们将作为separate parameter传递。例如:

re.sub("\.", "", "a.b.c.d", flags=re.MULTILINE)

y/<pattern>/<replacement>
# is equivivalent to
trans = str.maketrans("<pattern>", "<replacement>")
<input>.translate(trans)

但在y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/的情况下,它就像<input>.lower()一样简单。


for file in $(ls rootDirectory)大致相当于(取自here

files = [f for f in os.listdir('<rootDirectory>') if os.path.isfile(f)]
for f in files:
    # do something

所有在一起:

import os # don't forget to import required modules
import re

output_file = open('C:\\temp\\output.txt', 'w')

def process(line):
    result = line
    result = re.sub("\"","", result)
    result = re.sub("\.","", result)
    # do all the stuff your sed script does and than
    return result

files = [f for f in os.listdir('.') if os.path.isfile(f)]
for file in files:
    file_handle = open(file_name, 'r')
    lines = file_handle.readlines()
    processed = map(process, lines)
    for line in processed:
        output_file.write(line)

有关详细信息,请参阅regexfile operations的Python文档。

您可能希望尝试自动将sed脚本转换为Python,但如果这是一次性要求,则手动执行此操作会更简单。