假設我有以下檔案:
document1 = '1. Hello world\n1.1 bla bla bla\n1.2 more bla bla\n1.3 even more bla bla ABC\n\n2. ABC \n2.1 hello ABC\n2.2 bla bla bla\n\n3. XYZ\n3.1 bla bla\n3.2 more bla bla\n3.3 even more bla bla'
它具有以下格式:
1. Hello world
1.1 bla bla bla
1.2 more bla bla
1.3 even more bla bla ABC
2. ABC
2.1 hello ABC
2.2 bla bla bla
3. XYZ
3.1 bla bla
3.2 more bla bla
3.3 even more bla bla
我想知道如何選擇ABC section only,這樣我才能得到輸出:
2. ABC
2.1 hello ABC
2.2 bla bla bla
有人可能會建議這樣做,re.findall(r'^2\..*', document1, re.MULTILINE)但注意 ABC section并不總是必須在第 2 點。例如,我可以:
document2 = '1. Hello world\n1.1 bla bla bla\n1.2 more bla bla\n1.3 even more bla bla ABC\n\n2. XYZ\n2.1 bla bla\n2.2 more bla bla\n2.3 even more bla bla\n\n\n3. MNO\n 3.1 hello MNO\n3.2 bla bla bla\n\n\n4. ABC\n4.1 hello ABC\n4.2 bla bla bla'
1. Hello world
1.1 bla bla bla
1.2 more bla bla
1.3 even more bla bla ABC
2. XYZ
2.1 bla bla
2.2 more bla bla
2.3 even more bla bla
3. MNO
3.1 hello MNO
3.2 bla bla bla
4. ABC
4.1 hello ABC
4.2 bla bla bla
其中ABC是在第4部分。
uj5u.com熱心網友回復:
我會將文本分成幾段:
>>> document1.split("\n\n")
[
"1. Hello world\n1.1 bla bla bla\n1.2 more bla bla\n1.3 even more bla bla ABC",
"2. ABC \n2.1 hello ABC\n2.2 bla bla bla",
"3. XYZ\n3.1 bla bla\n3.2 more bla bla\n3.3 even more bla bla"
]
>>> document2.split("\n\n")
[
"1. Hello world\n1.1 bla bla bla\n1.2 more bla bla\n1.3 even more bla bla ABC",
"2. XYZ\n2.1 bla bla\n2.2 more bla bla\n2.3 even more bla bla",
"\n3. MNO\n 3.1 hello MNO\n3.2 bla bla bla",
"\n4. ABC\n4.1 hello ABC\n4.2 bla bla bla"
]
然后搜索包含“.ABC”的段落:
found = next((para for para in document1.split("\n\n") if ". ABC" in para), "")
以上也適用于 document2。如果你愿意,你可以更換試驗". ABC" in para用re.search(r"\d \. ABC", para)。
uj5u.com熱心網友回復:
您可以使用
^\d \.\s*ABC[^\S\n]*(?:\n. )*
請參閱正則運算式演示。僅re.M在編譯正則運算式物件時傳遞標志。詳情:
^- 一行的開始\d- 一位或多位數字\.- 一個點\s*- 零個或多個空格ABC-ABC字串[^\S\n]*- 除 LF 字符以外的零個或多個空格(?:\n. )*- 零個或多個非空行。
要獲得所有匹配項,您可以使用
matches = re.findall(r'^\d \.\s*ABC[^\S\n]*(?:\n. )*', document1, re.M)
要獲得第一場比賽,您只能使用
match = re.search(r'^\d \.\s*ABC[^\S\n]*(?:\n. )*', document1, re.M)
if match:
print(match.group())
uj5u.com熱心網友回復:
這是獲取它的一種方法,首先提取該部分的初始數字,然后應用您建議的 findall 方法。請注意,如果該部分出現多次,則需要調整代碼。
import re
document1 = '1. Hello world\n1.1 bla bla bla\n1.2 more bla bla\n1.3 even more bla bla ABC\n\n2. ABC \n2.1 hello ABC\n2.2 bla bla bla\n\n3. XYZ\n3.1 bla bla\n3.2 more bla bla\n3.3 even more bla bla'
document2 = '1. Hello world\n1.1 bla bla bla\n1.2 more bla bla\n1.3 even more bla bla ABC\n\n2. XYZ\n2.1 bla bla\n2.2 more bla bla\n2.3 even more bla bla\n\n\n3. MNO\n 3.1 hello MNO\n3.2 bla bla bla\n\n\n4. ABC\n4.1 hello ABC\n4.2 bla bla bla'
def get_section(document, substr):
section_expr = "\d*\. " substr
section_no = re.findall(section_expr, document)[0].rsplit('. ', 1)[0]
subsection_expr = str(section_no) '\..*'
return re.findall(subsection_expr, document)
print(get_section(document1, "ABC"))
print(get_section(document2, "ABC"))
結果:
['2. ABC ', '2.1 hello ABC', '2.2 bla bla bla']
['4. ABC', '4.1 hello ABC', '4.2 bla bla bla']
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/358673.html
上一篇:根據第一個匹配選擇子字串,也需要更早的第二個模式匹配
下一篇:將正則運算式串列與字串串列匹配
