我认为我的问题几乎是不言自明的,但我仍然会发布一个更清晰的例子。
我有完整的工作脚本来评论/取消注释在Gedit编辑器中打开的Javascript文件中的行。
#! /usr/bin/env python
import sys
import StringIO
block = sys.stdin.read()
block = StringIO.StringIO(block)
msg = ''
for line in block:
if "//~" in line:
line = line.replace('//~','')
msg = "All lines in selection uncommented"
else:
line = "//~" + line
msg = "All lines in selection commented"
sys.stdout.write(line)
exit(msg)
现在我想把//~
放在实际行的开头(不是空格或制表符,但是当真正的行开始时,即字符和字符串)。
如果我使用下面的正则表达式模块执行此操作,那么它会添加//~
两次,表示行的开始和行的实际开始。
#! /usr/bin/env python
import sys
import StringIO
import re
block = sys.stdin.read()
block = StringIO.StringIO(block)
msg = ''
for line in block:
if "//~" in line:
line = re.sub(r"(\s*)(\S.*)", r"\1//~\2", line)
line = line.replace('//~','')
msg = "All lines in selection uncommented"
else:
line = re.sub(r"(\s*)(\S.*)", r"\1//~\2", line)
line = "//~" + line
msg = "All lines in selection commented"
sys.stdout.write(line)
exit(msg)
如何在python中使用/不使用Regex?
答案 0 :(得分:0)
您可以使用正则表达式替换来执行此操作。例如,这行代码应该做你想要的
line = re.sub(r"^(\s*)(\S.*)", r"\1//~\2", line)
此正则表达式匹配0个或更多空格字符[(\ s *)],然后匹配字符串[(\ S. *)]的其余部分。然后将它替换为第一个捕获组[\ 1],空格,然后是两个斜杠[//〜],然后是字符串[\ 2]的其余部分。