我正在尝试使用python处理c ++文件中所有包含/ *测试号* /的行。
例如a.cpp:
int main(void)
{
/* Test 1 */ //will be found, and replaced.
int a =1;
/* Test 2 */ //will be found, and replaced.
int b = 2;
return 0;
}
在python中,我尝试过:
with open(fname, 'rw') as f:
for line_term in f:
line = line_term.rstrip('\n')
if(re.match('/\*\s[Test]\s\d+\*/', line):
print line
但是我根本没有打印出来。 我是regex表达的新手,请提出您的建议。
答案 0 :(得分:1)
我更正了您的正则表达式和 if 语句语法。
with open(fname, 'rw') as f:
for line_term in f:
line = line_term.rstrip('\n')
if re.match('\/\* Test \d+ \*\/', line):
print line
答案 1 :(得分:1)
re.match从字符串的开头开始匹配,因此您可以通过匹配一个或多个空格来开始模式。
您可以省略[Test]
周围的方括号,因为这意味着这些字符位于character class中,并且与列出的任何字符都匹配,这些字符也可以写为[Ttes]
。
请注意,匹配数字后会缺少空格,使用\s
也将匹配换行符,如果只想匹配同一行的字符,则可能不需要换行符。
为清楚起见,空格位于方括号之间,但不必。
[ ]+/\*[ ]Test[ ]\d+[ ]\*/
您的代码可能如下:
with open(fname, 'rw') as f:
for line_term in f:
line = line_term.rstrip('\n')
if(re.match(' +/\*\sTest \d+ \*/', line)):
print (line)
答案 2 :(得分:0)
使用search()
代替match()
,因为re.match()仅在字符串的开头匹配,也可以使用re.sub()在一个步骤中匹配和替换字符串:
with open(fname, 'r') as f:
for line_term in f:
line = line_term.rstrip('\n')
if(re.search(r'/[*] Test \d+ [*]/', line)):
print (line)
输出:
/* Test 1 */ //will be found, and replaced.
/* Test 2 */ //will be found, and replaced.
答案 3 :(得分:0)
听起来您已经从注释中获得了基本问题的解决方案,但是让我们看一下您的正则表达式,以便您了解问题所在。
您的正则表达式:
\*\s[Test]\s\d+\*
大部分情况下看起来不错。您已经通过在前面加上\来逃避*。您正在使用\ s来匹配空格。它将与您,选项卡或回车符或其他任何空格相匹配。如果您只是想要一个看起来像您想要的空间,则可以在其中放置一个空间(例如:/ *测试* /“)。
您最主要的错误是[测试]。这就是所谓的字符类或字符集。这将匹配T或e或s或t。只是其中之一。不是“测试”。删除字符类括号后,将剩下“ Test”字样,它将与之完全匹配。字符类确实非常有用,但是如果您想匹配特定的东西。如果我们要匹配1、2、3、4,T和c或其他值,我们可以执行此操作[1234Tc]。
If you want it one or more times, [1234Tc]+
If you want it zero or more times, [1234Tc]*
If you want it to match between 2 and 5 times, [1234Tc]{2,5}
If you want it to match 4 times, [1234Tc]{4}
最后一个将为您的角色类工作。 [测试] {4}将与您的测试匹配。也就是说,它也将与“ esTt”匹配
无论如何,希望可以使您对那里发生的事情有更好的了解。学习完所有规则后,它将最终单击。 regexing开心
答案 4 :(得分:0)
with open(fname, 'rw') as f:
for line_term in f:
line = line_term.rstrip('\n')
if re.match('.*\/\* Test \d+ \*\/.*', line):
print line;
答案 5 :(得分:0)
如果要用一种特定的东西替换找到的模式,则应使用re.sub方法。
with open(fname, 'rw') as f:
content = f.read()
pattern = r'/\*\s*[Tt][Ee][Ss][Tt]\s*\d+.*?(?<=\*/)'
replacement = str()
print(re.sub(pattern, replacement, content))
您的输入将被打印出来,并且没有带有“测试号”的注释。
现在让我们看看模式本身:
/\*
->评论的开头
\s*[Tt][Ee][Ss][Tt]\s*\d+
->测试部件及其编号,并在其周围留空白
+.*?(?<=\*/)
->一直进行到第一个评论关闭部分
我不建议替换所有行,因为该行可以包含另一个多行注释,该注释以上一行结束。