Python 在文本中找到模式的另一个实例之前,如何捕获模式之后的所有内容?

Python 在文本中找到模式的另一个实例之前,如何捕获模式之后的所有内容?,python,regex,Python,Regex,更具体地说,我正在处理几个不同演讲者之间对话的txt文件。我正试着根据说话人把课文分开。该文件如下所示: S1:那是(你的日程安排。) S2:好的 非常感谢苏,我想我现在感觉好多了。 学生2:所以我不得不说,和一个不辍学的人交谈真的很愉快。你不知道掉了多少,就像uu很好[S1:好的]好的[S1:非常感谢苏]再见,下一步。。。你是玛丽安? S3:是的。你好 你好,我是苏 S3:嗨 学生2:嗯,她在外面打你了吗? 所以我创建了一个空的数据框来存储每个发言者所说的一切。我希望S1所说的每件事都要比S

更具体地说,我正在处理几个不同演讲者之间对话的txt文件。我正试着根据说话人把课文分开。该文件如下所示:

S1:那是(你的日程安排。)
S2:好的
非常感谢苏,我想我现在感觉好多了。
学生2:所以我不得不说,和一个不辍学的人交谈真的很愉快。你不知道掉了多少,就像uu很好[S1:好的]好的[S1:非常感谢苏]再见,下一步。。。你是玛丽安?
S3:是的。你好
你好,我是苏
S3:嗨
学生2:嗯,她在外面打你了吗?
所以我创建了一个空的数据框来存储每个发言者所说的一切。我希望S1所说的每件事都要比S2所说的每件事分开存储,以此类推

我的问题是我不知道如何捕获每个说话人ID之间的文本。因此,例如,当它看到“S1:”时,它将捕获所有文本,直到看到“S2:”。以下是我目前正在处理的问题。结果是“无”

df=pd.DataFrame(columns=['Speaker ID', 'Role', 'Genger', 'Utterance', '# of Words', '# of Pronouns', '1st P SG', '1st P PL', '2nd P'])
#print (df)
f=open('Academic_Advising.txt').read()
try:
    pattern=re.search('^S\d+', f).group()
except: AttributeError
pattern=None
print (pattern)

对不起,如果这是长篇大论。我只是想说清楚。

也许这可以帮助你在旅途中:

import re
import pandas as pd 

def main() -> pd.DataFrame: 
    s = """S1: that's (your schedule.)
S2: okay
S1: thanks a lot Sue i think i feel much better now.
S2: so it's really nice to talk to somebody who's not dropping a class <S1: LAUGH> i have to say. you don't know how many dropped just like_ that's good <WALKS S1 TO THE DOOR>[S1: alright ] okay [S1: thanks a lot Sue ] bye-bye next... you're Marianne?
S3: yeah. hi
S2: hi i'm Sue
S3: hi
S2: um did she hit you out there?"""
    messages = {}
    data_rows = []
    splitted = re.split("(S\d+:)", s)
    print(splitted)
    for i, message in enumerate(splitted):
        if (i+1) % 2 == 0:
            print(f"use {message} as key ")
            speaker_id = message
            message = splitted[i+1]
            message_id = messages.get(speaker_id, 0)
            word_count = len(message)
            data_rows.append([speaker_id, message, word_count])
    df = pd.DataFrame(data_rows, columns=["SpeckerId", "Message", "WordCount"])

    print(df.head())
    return df 

if __name__ == '__main__':
    main()
重新导入
作为pd进口熊猫
def main()->pd.DataFrame:
s=“”S1:那是(你的日程安排。)
S2:好的
非常感谢苏,我想我现在感觉好多了。
S2:所以我不得不说,能和一个不辍学的人交谈真的很高兴。你不知道有多少人辍学了,就像uu好的[S1:好的]好的[S1:非常感谢苏]再见,下一步……你是玛丽安?
是的,你好
你好,我是苏
S3:嗨
学生2:嗯,她在外面打你了吗?”
消息={}
数据_行=[]
splitted=re.split(“(S\d+:)”,S)
打印(拆分)
对于i,枚举中的消息(拆分):
如果(i+1)%2==0:
打印(f“使用{message}作为键”)
发言人_id=信息
消息=已拆分[i+1]
message\u id=messages.get(演讲者id,0)
字数=len(消息)
数据行。追加([说话人id、消息、字数])
df=pd.DataFrame(数据行、列=[“SpeckerId”、“Message”、“WordCount”])
打印(df.head())
返回df
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()

Imo,将defaultdict与简单正则表达式结合使用:

from collections import defaultdict
import re

text = """
S1: that's (your schedule.)
S2: okay
S1: thanks a lot Sue i think i feel much better now.
S2: so it's really nice to talk to somebody who's not dropping a class <S1: LAUGH> i have to say. you don't know how many dropped just like_ that's good <WALKS S1 TO THE DOOR>[S1: alright ] okay [S1: thanks a lot Sue ] bye-bye next... you're Marianne?
S3: yeah. hi
S2: hi i'm Sue
S3: hi
S2: um did she hit you out there?
"""

dd = defaultdict(list)
rx = re.compile(r'(S\d+):\s+(.+)', re.MULTILINE)

for match in rx.finditer(text):
    key, value = match.groups()
    dd[key].append(value)

print(dd)
从集合导入defaultdict
进口稀土
text=”“”
S1:那是(你的日程安排。)
S2:好的
非常感谢苏,我想我现在感觉好多了。
S2:所以我不得不说,能和一个不辍学的人交谈真的很高兴。你不知道有多少人辍学了,就像uu好的[S1:好的]好的[S1:非常感谢苏]再见,下一步……你是玛丽安?
是的,你好
你好,我是苏
S3:嗨
学生2:嗯,她在外面打你了吗?
"""
dd=默认DICT(列表)
rx=re.compile(r'(S\d+):\S+(.+)',re.MULTILINE)
对于rx.finditer中的匹配(文本):
key,value=match.groups()
dd[键]。追加(值)
印刷品(dd)
产生

defaultdict(<class 'list'>, 
    {'S1': ["that's (your schedule.)", 'thanks a lot Sue i think i feel much better now.'], 
     'S2': ['okay', "so it's really nice to talk to somebody who's not dropping a class <S1: LAUGH> i have to say. you don't know how many dropped just like_ that's good <WALKS S1 TO THE DOOR>[S1: alright ] okay [S1: thanks a lot Sue ] bye-bye next... you're Marianne?", "hi i'm Sue", 'um did she hit you out there?'], 
     'S3': ['yeah. hi', 'hi']})
defaultdict(,
{'S1':[“那是(你的日程安排。)”,“非常感谢,苏,我想我现在感觉好多了。”,
‘S2’:[‘好吧’,‘和一个我不得不说没有辍学的人谈话真是太好了。你不知道有多少人辍学了,就像uu那很好[S1:好吧]好的[S1:非常感谢苏]再见,下一步……你是玛丽安?,‘嗨,我是苏’,‘嗯,她打你了吗?’,
'S3':['yeah.hi','hi']]

之后,您可以轻松地将dict传输到数据帧。

这太棒了!谢谢你的帮助!我还有一个问题。经过测试,文本中似乎有几个地方一个演讲者打断了另一个演讲者,他们没有为那个演讲者的打断创建新行。它们与被打断的演讲者放在同一正文中。此代码似乎无法将其分离并附加到正确的说话人。我怎样才能解决这个问题?