如何使用str.find或regex查找子字符串?

时间:2019-05-13 20:32:04

标签: python regex string

我正在尝试使用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表达的新手,请提出您的建议。

6 个答案:

答案 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+[ ]\*/

Regex demo

您的代码可能如下:

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+->测试部件及其编号,并在其周围留空白

+.*?(?<=\*/)->一直进行到第一个评论关闭部分

我不建议替换所有行,因为该行可以包含另一个多行注释,该注释以上一行结束。