我在文件(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,但如果这是一次性要求,则手动完成会更简单。