Python脚本,用于匹配忽略制表符和空格的实际行开头

时间:2016-06-28 06:49:56

标签: javascript python regex pattern-matching gedit

我认为我的问题几乎是不言自明的,但我仍然会发布一个更清晰的例子。

我有完整的工作脚本来评论/取消注释在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?

1 个答案:

答案 0 :(得分:0)

您可以使用正则表达式替换来执行此操作。例如,这行代码应该做你想要的

line = re.sub(r"^(\s*)(\S.*)", r"\1//~\2", line)

此正则表达式匹配0个或更多空格字符[(\ s *)],然后匹配字符串[(\ S. *)]的其余部分。然后将它替换为第一个捕获组[\ 1],空格,然后是两个斜杠[//〜],然后是字符串[\ 2]的其余部分。