簡體   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