繁体   English   中英

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

[英]How to find a substring using str.find or regex?

我正在尝试使用python处理包含/ * Test number * /在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

但我根本没有打印出来。 我是正则表达式的新手,请给出你的建议。

我更正了你的正则表达式和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

re.match在字符串的开头开始匹配,因此您可以使用匹配的一个或多个空格来启动模式。

您可以省略[Test]周围的方括号,因为这意味着字符位于字符类中 ,并且可以匹配任何列出的字符,这些字符也可以写为[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)

使用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.

听起来你已经从评论中得到了基本问题的解决方案,但让我们来看看你的正则表达式,这样你就可以理解问题是什么了。

你的正则表达式:

\*\s[Test]\s\d+\*

它在大多数情况下都很好看。 你已经通过在前面添加\\来逃脱了*。 你正在使用\\ s来匹配空间。 这将匹配任何空白的心灵,一个标签或一个输入,或任何其他。 如果你只是想要空间,你可以在那里放一个空格(如:/ * Test * /“)。

你遇到的主要问题是[测试]。 这就是所谓的字符类或字符集。 这将匹配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”

无论如何,希望这能让你更好地了解那里发生的事情。 一旦你学会了所有的规则,它最终会点击。 快乐的复兴

 with open(fname, 'rw') as f: for line_term in f: line = line_term.rstrip('\\n') if re.match('.*\\/\\* Test \\d+ \\*\\/.*', line): print line; 

如果要用一个特定的东西替换找到的模式,那么你应该使用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+ - >带有数字的测试部分,以及它周围的空白区域

+.*?(?<=\\*/) - >一直到第一个评论结束部分

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM