使用正则表达式重命名文本文件的内容

时间:2009-09-21 21:54:46

标签: python regex eclipse

我有一个文本文件,其中包含以下格式的几行:

gatename #outputs #inputs list_of_inputs_separated_by_spaces * gate_id

example: 
nand 3 2 10 11 * G0 (The two inputs to the nand gate are 10 and 11)
or 2 1 10 * G1 (The only input to the or gate is gate 10)

我需要做的是重命名内容,以便我删除#outputs列,以便最终结果是:

gatename #outputs list_of_inputs_separated_by_spaces * gate_id
nand 2 10 11 * G0
or 1 10 * G1

我尝试使用Eclipse的查找和替换功能(查找参数是一个不起作用的正则表达式语句),但它最终弄乱了网关名称。我正在考虑使用Python脚本并迭代文本文件的每一行。我需要帮助的是确定适当的正则表达式是什么。

5 个答案:

答案 0 :(得分:4)

这基本上是cut实用程序的用途:

cut -d " " -f 1,3-

(更新:我忘记了-f选项,抱歉。)

这需要一个文件,考虑用空格分隔的字段,并输出第一个,第三个和第三个字段。

(如果您使用的是Windows,那么无论如何都应该使用这些unix-style utilities,它们非常有用。)

使用正则表达式,您可以将(\w+) \d+ (.*)替换为$1 $2。类似的东西:

sed -r -e "s/([^ ]+) [0-9]+ (.*)/\1 \2/" file

perl -p -e "s/(\w+) \d+ (.*)/\1 $2/" file

答案 1 :(得分:2)

像......这样的东西:

for theline in fileinput.input(inplace=1):
  print re.sub(r'(\w+\s*+)\d+\s+(.*)', r'\1\2', theline),

......应该满足您的需求。

答案 2 :(得分:1)

就个人而言,如果是文档结构,请不要打扰正则表达式。

只需遍历文件,对“”字符进行拆分,然后省略第二个条目。

答案 3 :(得分:1)

您确实可以使用Eclipse的查找和替换功能,使用以下内容:

Find: ^([a-z]+) \d
Replace with: \1

这基本上匹配每行开头的门名(^([a-z]+)),后跟输出(\d),并将其替换为匹配的门名(\1)。

答案 4 :(得分:0)

我不知道你在使用Eclipse的平台是什么,但如果它是linux或者你有cygwin,那么cut非常快!

cut -d" " --complement -f2 $FILE

这将使用space作为分隔符,并选择第二个字段的补码。

如果你真的想使用正则表达式,你可以这样做:

sed -r 's/^ *([^ ]+) +[^ ]+ +(.+)/\1 \2/' $FILE

当然,你可以在python或perl中轻松使用相同的表达式,但是Mitchel的右键 - 分裂很容易。 (除非文本非常长,否则会浪费时间不必要地拆分其他字段。)