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

问题描述:

我的成绩单是这样的:Python的正则表达式在同一行中找到的短语

speaker1 (caller): hello. 
speaker2 (agent): thank you for calling. 
speaker1 (caller): I need some help with my account 3429. 
speaker2 (agent): Sure let me help. 

他们是“的形式,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,一些文字,我需要捕捉,然后结尾处的另一个扬声器N(指示新的列表)或行结束。这是我试图捕获的逻辑,但它将整个脚本放入一个列表元素中,并在第二个列表中放入一个空字符串。任何帮助,将不胜感激。

+0

're.findall(R '\(*',S)' –

正则表达式只会产生不重叠的匹配。所以你不能在你的模式中出现两次speaker。你需要把它放在里面前瞻:

speaker\d+ (\([^(]*?)(?=\s+speaker\d+|$) 

这将捕获文本组1

Demo.

+0

什么的'[^(]'部分完成?是不是字面的括号出现在“(调用者')或'(代理)'已经编码在'\('在它之前? – covfefe

+0

@ user3004041是的,'\('匹配paren。'[^(]'匹配任何东西_但_ paren。 –

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

.*?将马上停止匹配时,发现另一扬声器的发生,而.*将保持匹配任何字符直到最后一次出现。希望能帮助到你。

编辑:speaker \ d +,。将只匹配一个字符。

编辑:如果单词'说话者'进入对话之间不好。因此,使用

aList = re.findall('speaker\d+\s*(.*?)(?=\sspeaker\s*\(|$)', transcript)