Python正则表达式在同一行中查找短语

Python正则表达式在同一行中查找短语,python,regex,Python,Regex,我有这样的成绩单: speaker1(呼叫者):您好。 发言人2(代理人):谢谢你打电话来。 通话者1(来电者):我需要一些关于我的帐户3429的帮助。 发言人2(特工):当然,让我来帮你。 它们的形式为“speakerN(呼叫方或代理)”。我需要编写一个正则表达式来获取调用方和代理对话的列表。因此,对于上面的示例,我将输出: ['(caller): hello. ', '(agent): thank you for calling', '(caller): I need some help

我有这样的成绩单:

speaker1(呼叫者):您好。
发言人2(代理人):谢谢你打电话来。
通话者1(来电者):我需要一些关于我的帐户3429的帮助。
发言人2(特工):当然,让我来帮你。
它们的形式为“speakerN(呼叫方或代理)”。我需要编写一个正则表达式来获取调用方和代理对话的列表。因此,对于上面的示例,我将输出:

['(caller): hello. ', '(agent): thank you for calling', '(caller): I need some help with my account 3429.', '(agent): Sure let me help.']
以下是我目前掌握的情况:

aList = re.findall('speaker. (.*) speaker.|$', transcript)
print(aList)

我知道前面有一个speakerN,一些我需要捕获的文本,然后是另一个speakerN(表示一个新列表)或行的末尾。这是我试图捕捉的逻辑,但它将整个转录本放在一个列表元素中,将一个空字符串放在第二个列表元素中。任何帮助都将不胜感激。

Regex只生成不重叠的匹配。因此,您的模式中不能出现两次
扬声器。您需要将其放在前瞻中:

speaker\d+ (\([^(]*?)(?=\s+speaker\d+|$)
这将捕获组1中的文本


使用
aList=re.findall('speaker\d+\s(.*)(=\sspeaker |$),抄本)

*?
将在找到另一个匹配的说话人时立即停止匹配,而
*
将继续匹配任何字符直到最后一个匹配。希望能有帮助

编辑:扬声器\d+。将只匹配一个字符

编辑:如果对话中间出现“演讲者”一词,则不太好。所以使用

aList=re.findall('speaker\d+\s*(.*?)(=\sspeaker\s*(|$)”,转录本)
re.findall(r'\(.*),s)
这个
[^(]
部分完成了什么?在“(调用者)”或“(代理)”中出现的文字括号不是已经编码在
\(
前面的\(
匹配参数。
[^(]
匹配除参数以外的任何对象。