"sed -f" bash命令等效于python



我在文件(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)

谢谢!

像这样尝试 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() 中编译任何正则表达式

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

您必须将

sed脚本替换转换为 Python 等效项。


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

请注意,这是贪婪的,因此不需要在模式结束时进行/g。此外,您不应在模式中包含滞后,因为它们作为单独的参数传递。例如:

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)大致等同于(取自此处)

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)

有关详细信息,请参阅 Python 文档了解正则表达式和文件操作。

您可能想尝试将sed脚本自动转换为 Python,但如果这是一次性要求,则手动完成会更简单。

相关内容

  • 没有找到相关文章

最新更新