我在文件(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)
谢谢!
答案 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)
有关详细信息,请参阅regex和file operations的Python文档。
您可能希望尝试自动将sed
脚本转换为Python,但如果这是一次性要求,则手动执行此操作会更简单。