Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于多个文件中的列表的多个正则表达式替换_Python_Regex_Sed_Awk_Text Processing - Fatal编程技术网

Python 基于多个文件中的列表的多个正则表达式替换

Python 基于多个文件中的列表的多个正则表达式替换,python,regex,sed,awk,text-processing,Python,Regex,Sed,Awk,Text Processing,我有一个文件夹,里面有多个文本文件,我需要使用多个替换列表进行处理和格式化,如下所示: old string1~new string1 old string2~new string2 etc~blah 我从这些多个文本文件的每一行的替换列表中运行每个替换对。现在我有一组python脚本来执行这个操作。我想知道的是,如果我切换到sed或awk,是否会使代码更简单、更易于维护?这是一个更好的解决方案还是应该更好地改进Python代码?我问这个问题是因为传入的文本文件是定期出现的,并且通常与以前有一

我有一个文件夹,里面有多个文本文件,我需要使用多个替换列表进行处理和格式化,如下所示:

old string1~new string1
old string2~new string2
etc~blah
我从这些多个文本文件的每一行的替换列表中运行每个替换对。现在我有一组python脚本来执行这个操作。我想知道的是,如果我切换到sed或awk,是否会使代码更简单、更易于维护?这是一个更好的解决方案还是应该更好地改进Python代码?我问这个问题是因为传入的文本文件是定期出现的,并且通常与以前有一些不同的结构,比如错误、拼写错误、多个空格,因为这些文件是由人类创建的。因此,我必须不断调整代码和替换列表,使其正常工作。
谢谢。

除非您的python代码非常糟糕,否则切换到awk不太可能使其更易于维护。也就是说,它在awk中非常简单,但不能很好地扩展:

cat replacement-list-files* | awk 'FILENAME == "-" { 
  split( $0, a, "~" ); repl[ a[1] ] = a[2]; next }
  { for( i in repl ) gsub( i, repl[i] ) }1' - input-file

请注意,这种方法一次只能处理一个文件。将
1
替换为类似
{print>(FILENAME.new”)}
的内容以处理多个文件,但如果要处理大量文件,则必须关闭这些文件,这很快就会变成无法维护的混乱局面。如果您已经有了一个有效的解决方案,请坚持使用Python

除非您的python代码非常糟糕,否则切换到awk不太可能使其更易于维护。也就是说,它在awk中非常简单,但不能很好地扩展:

cat replacement-list-files* | awk 'FILENAME == "-" { 
  split( $0, a, "~" ); repl[ a[1] ] = a[2]; next }
  { for( i in repl ) gsub( i, repl[i] ) }1' - input-file

请注意,这种方法一次只能处理一个文件。将
1
替换为类似
{print>(FILENAME.new”)}
的内容以处理多个文件,但如果要处理大量文件,则必须关闭这些文件,这很快就会变成无法维护的混乱局面。如果您已经有了一个有效的解决方案,请坚持使用Python

以下是正则表达式替换脚本(大部分只是与@williampersell发布的内容在外观上有所不同):

但这里是我认为您真正需要的字符串替换脚本:

   awk -F'~' '
   NR==FNR{ map[$1] = $2; next }
   {
      for (old in map) {
         rlength = length(old)
         while (rstart = index($0,old)) {
            $0 = substr($0,1,rstart-1) map[old] substr($0,rstart+rlength)
         }
      }
   }
   ' /wherever/mappingFile file
在任何一种情况下,只需将其包含在shell循环中即可影响多个文件:

for file in *
do
   awk -F'~' '...' /wherever/mappingFile "$file" > tmp && mv tmp "$file"
done

下面是正则表达式替换脚本(大部分只是与@williampersell发布的内容在外观上有所不同):

但这里是我认为您真正需要的字符串替换脚本:

   awk -F'~' '
   NR==FNR{ map[$1] = $2; next }
   {
      for (old in map) {
         rlength = length(old)
         while (rstart = index($0,old)) {
            $0 = substr($0,1,rstart-1) map[old] substr($0,rstart+rlength)
         }
      }
   }
   ' /wherever/mappingFile file
在任何一种情况下,只需将其包含在shell循环中即可影响多个文件:

for file in *
do
   awk -F'~' '...' /wherever/mappingFile "$file" > tmp && mv tmp "$file"
done

很难说没有看到您的Python代码,所以我们更好地了解它是否是一个瓶颈…您在问题中使用了“string”一词,但您接受的解决方案使用了正则表达式,那么在“~”的左侧是字符串还是正则表达式?是的,我很抱歉造成混淆,我使用正则表达式,那些带~的字符串实际上是正则表达式。如果没有看到您的Python代码,很难说,因此我们更好地了解它是否是一个瓶颈……您在问题中使用了“string”一词,但您接受的解决方案使用正则表达式,所以在“~”的左侧是哪个是字符串还是正则表达式?是的,很抱歉给您带来了困惑,我使用正则表达式,那些带~的字符串实际上是正则表达式。仅供参考,无论您处理了多少文件,您都不必担心用GNU awk关闭文件。仅供参考,无论您处理了多少文件,您都不必担心用GNU awk关闭文件。