我有以下文字:(這與此密切相關但不相似)
text = '7\n\x0c\n7.\tA B C\n\n7.1\tbla bla bla .\n\n7.2\tanother bla bla \n\n7.3\tand another one.\n\n8.\tX Y Z\n\n8.1\tha ha ha \n\n(a)\thohoho ;\n\n(b)\thihihi,\n\n8'
我只想選擇第 7 節,以便我得到:
7. A B C
7.1 bla bla bla .
7.2 another bla bla
7.3 and another one.
所以我這樣做:
print(re.findall(r'^\d \.\s*A B C[^\S\n]*(?:\n\n. )*', text, re.M)[0])
這使:
7. A B C
7.1 bla bla bla .
7.2 another bla bla
7.3 and another one.
8. X Y Z
8.1 ha ha ha
(a) hohoho ;
(b) hihihi,
8
如您所見,8在8.1. 所以這對正則運算式來說似乎令人困惑,我想知道在這種情況下我能做什么?
請注意,節的數量通常可以不同,所以我不能做類似的事情
re.findall(r'^7\..*', text, re.MULTILINE)(即 ABC 可以放在其他節中)。
uj5u.com熱心網友回復:
您可以使用
^(\d \.)\s*A B C(?:\s*\n\1\b.*)*
^字串的開始(\d \.)\s*A B C捕獲組 1 以匹配 1 個數字和.,然后匹配A B C(?:非捕獲組整體匹配\s*\n匹配可選的空白字符和換行符\1\b對組 1 的反向參考后跟單詞邊界.*匹配該行的其余部分
)*關閉非捕獲組并可選擇重復它
請參閱正則運算式演示。
import re
text = '7\n\x0c\n7.\tA B C\n\n7.1\tbla bla bla .\n\n7.2\tanother bla bla \n\n7.3\tand another one.\n\n8.\tX Y Z\n\n8.1\tha ha ha \n\n(a)\thohoho ;\n\n(b)\thihihi,\n\n8'
pattern = r"^(\d \.)\s*A B C(?:\s*\n\1\b.*)*"
m = re.search(pattern, text, re.MULTILINE)
if m:
print(m.group())
輸出
7. A B C
7.1 bla bla bla .
7.2 another bla bla
7.3 and another one.
uj5u.com熱心網友回復:
這是找到7.和第一個之間的線的潛在解決方案8.:
m = re.search(r'^7\.\s*(?:.|\n) ?(?=\n8\.)', text, re.MULTILINE)
print(m.group() if m else None)
輸出:
7. A B C
7.1 bla bla bla .
7.2 another bla bla
7.3 and another one.
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/358664.html
下一篇:多條件正則運算式
