我正在处理文字记录,并试图找到一种方法,将发言者的姓名与他们的发言内容分开。我一直在尝试使用re.split,但到目前为止还没有任何运气。
dummyText1 = "bill: hello \nted: hello \nto you \nbill: goodbye \nted: goodbye \nto you"
-------------------
Original Transcript
-------------------
(L1) bill: hello
(L2) ted: hello
(L3) to you
(L4) bill: goodbye
(L5) ted: goodbye
(L6) to you
----------------
Desired Output
-------------------------
Speaker | Speech
-------------------------
bill | hello
ted | hello to you
bill | goodbye
ted | goodbye to you我最初的想法是对换行符+单词使用积极的展望,并使用":“符号来标记言语的开始,但这是行不通的。我也不知道如何分组将共享同一说话人的行(即,第2-3行和第5-6行被处理为一个单独的语音转换而不是单个行)。
splitText1 = re.split(r"(\n?=[a-z])*:", dummyText1, flags=re.MULTILINE) 我的预期输出将是一个列表对象列表,每个嵌套列表都包含语音ID和语音(作为字符串)。
desired_output = [['bill','hello'],['ted','hello to you'],['bill','goodbye'],['ted','goodbye to you']]发布于 2020-11-16 12:29:30
您可以使用
import re
dummyText1 = "bill: hello \nted: hello \nto you \nbill: goodbye \nted: goodbye \nto you"
p = r'^((?:[^\W\d_]|[^\S\r\n])+):(.*(?:\n(?!(?:[^\W\d_]|[^\S\r\n])+:).*)*)'
print( [[x.strip(),y.replace('\n','').strip()] for x,y in re.findall(p, dummyText1, re.M)])输出:
[['bill', 'hello'], ['ted', 'hello to you'], ['bill', 'goodbye'], ['ted', 'goodbye to you']]Regex详细信息
^ -行的开始(由于re.M,^在中断行后也匹配一个位置)((?:[^\W\d_]|[^\S\r\n])+) -第1组:一个或多个字母([^\W\d_])或(|)水平空格([^\S\r\n]): -一个冒号(.*(?:\n(?!(?:[^\W\d_]|[^\S\r\n])+:).*)*) -第2组:.* -行的其余部分(?:\n(?!(?:[^\W\d_]|[^\S\r\n])+:).*)* -零或更多次出现\n(?!(?:[^\W\d_]|[^\S\r\n])+:) -一个换行符,后面没有一个或多个字母或水平空格,然后是一个:字符.* -剩下的部分。https://stackoverflow.com/questions/64857655
复制相似问题