[英]Emulate Python str.find(substring) using iteration but not built-in functions
[英]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.