regex 如何获取带有 * 的组的所有出现次数?[已关闭]

zxlwwiss  于 2023-04-13  发布在  其他
关注(0)|答案(2)|浏览(88)

已关闭,该问题需要details or clarity,目前不接受回答。
**想要改进此问题?**通过editing this post添加详细信息并澄清问题。

2天前关闭。
Improve this question
Image A
我试图捕捉一个特定的角色扮演的对话(如邦德从没有时间死剧本)。
我使用了re的findall方法,但是它只返回了一个组的最后一次出现,尽管这个组可能匹配了多个出现。我需要得到所有这些出现。

import re
import PyPDF2

pdf_file = open('No-Time-To-Die-Read-The-Screenplay.pdf', 'rb')
reader = PyPDF2.PdfReader(pdf_file)
bond_lines = re.findall(r'BOND\s?(\(.+\))?\n(.+)\n?([a-z(D].+\s|Mormon.+\s|Commander.+\s)*', page_text)
for line in bond_lines:
    print(line)

打印:Image B
比较图像A匹配文本和图像B,问题是“([a-z(D].+\s|摩门教徒。|Commander.+\s)*”这第三个组只返回多个匹配项中的最后一个匹配项。我需要找到所有这些匹配项,这样我才能获得所有这些行。如何从带 * 的组中获得所有匹配项?

ifsvaxew

ifsvaxew1#

如果你有一个重复多次的组,结果只有最后一个匹配将包含在该组中。
为了得到想要的结果,将你的组重复放入另一个组中,像这样:

BOND\s?(\(.+\))?\n(.+)\n?(([a-z(D].+\s|Mormon.+\s|Commander.+\s)*)

在这种情况下,第三组将包含所有重复,第四组仅包含最后一个重复。
如果你对最后一个匹配不感兴趣,你可以使用非捕获组(?:...)

BOND\s?(\(.+\))?\n(.+)\n?((?:[a-z(D].+\s|Mormon.+\s|Commander.+\s)*)
r6hnlfcb

r6hnlfcb2#

我认为如果你像这样修改你的bond_lines,应该没问题:

bond_lines = re.findall(r'BOND\s?(.+.+)?\n(.+)\n?(?:(?:[a-z(D].+\s|Mormon.+\s|Commander.+\s)*)', page_text)

相关问题