的| 正則運算式中的符號似乎劃分了整個模式,但我需要劃分一個較小的模式......我希望它找到一個以“Q:”或“A:”開頭的匹配項,然后在下一個之前結束“問:”或“答:”。中間可以是任何東西,包括換行符。
我的嘗試:
string = "Q: This is a question. \nQ: This is a 2nd question \non two lines. \n\nA: This is an answer. \nA: This is a 2nd answer \non two lines.\nQ: Here's another question. \nA: And another answer."
pattern = re.compile("(A: |Q: )[\w\W]*(A: |Q: |$)")
matches = pattern.finditer(string)
for match in matches:
print('-', match.group(0))
我使用的正則運算式是(A: |Q: )[\w\W]*(A: |Q: |$).
這是多行相同的字串,僅供參考:
Q: This is a question.
Q: This is a 2nd question
on two lines.
A: This is an answer.
A: This is a 2nd answer
on two lines.
Q: Here's another question.
A: And another answer.
所以我希望括號能夠隔離開頭的兩種可能模式和結尾的三種模式,而是將其視為 4 個獨立的模式。它還將在最后包含下一個 A: 或 Q:,但希望您能明白我的意圖。我打算不使用該組或其他東西。
如果它有幫助,這是一個簡單的學習程式,它從文本檔案中獲取問題和答案以對用戶進行測驗。我能夠在問題和答案各只有一行的情況下完成它,但是我無法獲得包含多行的“A:”或“Q:”。
uj5u.com熱心網友回復:
一種方法是使用負前瞻?!來匹配一個換行符后跟一個A: | Q: 塊,如下所示:
^([AQ]):(?:.|\n(?![AQ]:))
您也可以在Regex Demo上嘗試一下。
這是@Wiktor 建議的另一種方法,應該更快一點:
^[AQ]:.*(?:\n (?![AQ]:). )*
稍微修改一下我們匹配.*而不是喜歡\n (但請注意,這也會在末尾捕獲空行):
^[AQ]:.*(?:\n(?![AQ]:).*)*
uj5u.com熱心網友回復:
我建議為此使用 for 回圈,因為至少對我來說更容易。要回答您的問題,為什么不只瞄準期間而不是下一個 A: | 問:?否則,您可能必須使用前瞻。
(A: |Q: )[\s\S]*?\.
[\s\S](通常用于匹配每個字符,但[\w\W]也可以使用)
*?是一個惰性量詞。它匹配盡可能少的字符。如果我們只有(A: |Q: )[\s\S]*?,那么它只會匹配(A: |Q: ),但我們有結尾\.。
\. 匹配文字句點。
對于 for 回圈:
questions_and_answers = []
for line in string.splitlines():
if line.startswith(("Q: ", "A: ")):
questions_and_answers.append(line)
else:
questions_and_answers[-1] = line
# ['Q: This is a question. ', 'Q: This is a 2nd question on two lines. ', 'A: This is an answer. ', 'A: This is a 2nd answer on two lines.', "Q: Here's another question. ", 'A: And another answer.']```
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/341569.html
