6

我正在使用 python 2.6 并且在我的长程序中有一堆打印语句。如何用我的自定义打印函数替换它们,我们称之为 scribble()。因为如果我只是搜索并将 print 替换为 scribble( 没有结束的双引号。我认为正则表达式就是这样,但我已经用它们进行了一天左右的实验,我似乎无法让它工作。

4

6 回答 6

10

使用 Pycharm

如果您使用的是 pycharm,则可以通过以下模式使用 Regex 函数:

Replace: print\s(.*)
With: print($1)

在此处输入图像描述

于 2018-10-22T09:29:55.410 回答
8

使用编辑器

我不知道您使用的是哪个编辑器,但如果它支持 RegEx 搜索和替换,您可以尝试以下操作:

Replace: print "(.*?)"
With: scribble( "\1" )

我在记事本++中对此进行了测试。

使用 Python

或者,您可以使用 Python 本身来完成:

import re

f = open( "code.py", "r" )
newsrc = re.sub( "print \"(.*?)\"", "scribble( \"\\1\" )", f.read() )
f.close()

f = open( "newcode.py", "w" )
f.write( newsrc )
f.close()
于 2012-05-11T21:42:32.323 回答
3

实际上,您可以使用附带的工具print将所有语句转换为print()函数。虽然此工具通常用于将 Python 2 程序尽可能完整地转换为 Python 3 程序,但它实际上是一些小修复程序的集合,您可以选择运行哪些修复程序。在您的情况下,您可以通过在调用时提供参数来仅运行修复程序。2to3print-f print2to3

于 2012-05-11T22:07:51.133 回答
1

您可以重载打印功能,而不是替换它!

在 python 2.x 中,这是不可能的。但是有一些工具可以将 python 2.x 转换为 python 3 代码。

通过转换器运行您的代码,然后重载打印功能。

低于 2.6 的 python 版本仍然通过使用 from future支持打印函数(因此重载)。因此,一旦被隐藏,您的代码仍应适用于旧版本。虽然如果不使用 3.x 似乎大多数都在使用 2.7 所以你将来可能不需要

于 2012-05-11T21:59:12.013 回答
0

如果您还没有使用真正的 IDE,这是一个可以帮助您的地方。使用像 PyCharm 或 Eclipse 这样的 IDE,您可以使用重构来用不同的调用替换对特定函数的所有调用。

于 2012-05-11T21:41:38.877 回答
0

这是一个 Emacs 实现,默认情况下,它将打印语句转换为打印函数,并可选择将任何语句更改为任何函数。我试图清楚地记录它,但如果有任何不清楚的地方,请告诉我。

OP 可以与 . 交互M-x my-statement-to-function RET scribble RET或以编程方式使用它(my-statement-to-function "print" "scribble")

(defun my-statement-to-function (&optional statement func)
  "Convert STATEMENT to FUNC.

For use with statements in Python such as 'print'.  Converts
statements like,

  print \"Hello, world!\"

to a function like,

  print(\"Hello, world\")

Also works generally so that the STATEMENT can be changed to any
FUNC.  For instance, a 'print' statement,

  print \"Hello, world!\"

could be changed to a function,

  banana(\"Hello, world!\")

Default STATEMENT is 'print'.  Default FUNC is
STATEMENT (e.g. 'print').  Prompt for STATEMENT and FUNC when
called with universal prefix, `C-u'."
  (interactive "p")
  (let* ((arg statement)  ; statement argument overwritten, so preserve value
     ;; only prompt on universal prefix; 1 means no universal, 4 means universal
     (statement (cond ((eql arg 1) "print")  ; no prefix
                      ((eql arg 4) (read-string "Statement (print): " "" nil "print")))) ; C-u
     (func (cond ((eql arg 1) statement)  ; no prefix
                 ((eql arg 4) (read-string (concat "Function " "(" statement "): ") "" nil statement)))) ; C-u
     ;; [[:space:]]*  -- allow 0 or more spaces
     ;; \\(\"\\|\'\\) -- match single or double quotes
     ;; \\(\\)        -- define capture group for statement expression; recalled with \\2
     (regexp (concat statement "[[:space:]]*\\(\"\\|\'\\)\\(.*?\\)\\(\"\\|'\\)"))
     ;; replace statement with function and place statement expression within parentheses \(\)
     (replace (concat func "\(\"\\2\"\)")))
    (goto-char (point-min))
  (while (re-search-forward regexp nil t)
    (replace-match replace))))

于 2021-04-27T17:07:46.240 回答