大家好,我需要帮助处理Python和RegEx的混合。我正在进行一个项目,该项目获取原始文本并将其转换为XML。这篇课文由多个人说不同的话组成。我想要做的是把演讲分解并转换成XML。
示例字符串是:
考克斯先生。Lorem ipsum dolor坐好了,敬请光临。[医]独叶前庭[医]羊水、羊肚、羊肚、羊水、羊角、羊皮、羊皮、羊角、羊皮、羊角一次大范围的性骚扰。[医]乳,[医]乳南皂荚,羊肚草,乌贼坐在同一位置。[医][医]无叶缘叶。设施空洞。Lorem ipsum dolor坐好了,敬请光临。[医]金银花根。埃尼安,一位司空见惯的法官,一位高级法官,一位高级法官。前条件,狮子座在大芹菜,利奥米预浸,和矢状体智齿菜。[医][法][[ Nulla ]][[Nulla]]。西巴斯先生。枕叶小叶炎。如果你想要诱惑我的话,你就会觉得很奇怪。阿利库姆庸俗,狮子座在阿利凯劳雷特,塞姆前达皮布天鹅绒,nec不需要饮食猫科动物告诉利奥。Nunc mattis velit sed turpis consectetur tempus.这是一种很好的方法。眼镜蛇。[医]苦瓜,苏打草。[医]壶腹状长石形成层,形成层。库拉比托洛姆自由,莫利斯神圣性苔藓坐在同样,镀锡玻璃体。结果显示,这是一种严重的疾病。Nunc magna justo,sollicitudin at enim vel,volutpat皂素。毛利人坐在同样的地方,不允许吃,诱惑,容易,不健康。祈祷圣洁利奥一个埃洛斯马蒂斯诱惑。雷克斯先生。nunc sodales,id posuere nisl malesuada.Nam乳状液和巨噬细胞。毛乌素( Nullam vitae mauris sodales ),边缘紫苏( fringilla augue at ),有效菌种( efficitur arcu )。Sed diam,ullamcorper一个拍卖者电子产品,迷人的坐在同样的位置。乌尔纳埃罗斯,乌拉可得,小叶鱼。镰刀拍卖人,无赖坐同样的条件,大自由的门,神圣性的posuere非无主。全神贯注,长眠于世,独角兽。这句话的意思是:‘.’.‘’整数在紫色电子获取多萝卜素和马萨。[医][医]肉桂,[医]肉桂,[医]天麻。大叶水母,无齿鱼,叶不允许食用。[医]耳鼻喉科矢状体,条纹花,双子座。
以上只是一个样本。RegEx和Python需要读取整个文件、写扬声器以及找到的他们的演讲。
以上所述所产生的结果如下:
<Gutenberg>
<Speaker>Mr. COX</Speaker>
<Speech>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum sollicitudin vestibulum consectetur. Aliquam rhoncus nisl id velit gravida, quis volutpat est eleifend. Donec posuere a magna ac molestie. Vivamus sed lacinia lectus, quis feugiat libero. Nam sapien lacus, hendrerit at posuere ut, ullamcorper sit amet augue. Ut fringilla lobortis nulla. Nulla facilisi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam efficitur rutrum dictum. Aenean a sem mollis justo scelerisque posuere eget sit amet orci. Praesent condimentum, leo at commodo dapibus, leo mi pretium lectus, et sagittis lorem sapien ut enim. Nulla sagittis varius eros, eget pretium arcu suscipit aliquet. </Speech>
<Speaker>Mr. SEABASS</Speaker>
<Speech>Ut condimentum lobortis suscipit. Donec eget tempor ex, vel porttitor velit. Aliquam vulputate, leo in aliquet laoreet, sem ante dapibus velit, nec imperdiet felis tellus vel leo. Nunc mattis velit sed turpis consectetur tempus. Nam volutpat vel metus sed aliquam. Curabitur vitae elit urna. Nulla vehicula sapien quis libero elementum, vitae sodales tellus commodo. Pellentesque pulvinar felis vitae neque viverra posuere vitae sit amet neque. Curabitur lorem libero, mollis consectetur tempus sit amet, tincidunt vitae dolor. Cras ullamcorper arcu ac orci pharetra consequat. Nunc magna justo, sollicitudin at enim vel, volutpat elementum sapien. Mauris sit amet velit in diam imperdiet tempor facilisis et ex. Praesent consectetur leo a eros mattis tempor.</Speech>
<Speaker>Mr. REX</Speaker>
<Speech>Nullam interdum urna quis nunc sodales, id posuere nisl malesuada. Nam nec lacus et ipsum ultrices pharetra. Nullam vitae mauris sodales, fringilla augue at, efficitur arcu. Sed ex diam, ullamcorper a auctor eget, volutpat sit amet est. Suspendisse urna eros, ullamcorper in semper at, lobortis eget quam. Fusce auctor, augue sit amet convallis condimentum, diam libero porta lectus, consectetur posuere nisi mi non nulla. Suspendisse vel ante efficitur, eleifend justo sed, lobortis augue. Sed rhoncus neque libero, et tempor ipsum imperdiet id. Integer at purus eget dolor pharetra varius ut et massa. Etiam risus enim, ultrices vitae nisl eu, interdum dignissim tellus. Nullam tellus metus, finibus non justo at, lobortis imperdiet tortor. Nulla nec tortor sagittis, fringilla nisi quis, bibendum leo. </Speech>
</Gutenberg>现在我已经有了负责查找扬声器的RegEx。然而,我很难将发言与发言者相匹配。此外,发言和发言将是不同的,而不是相同的三个发言者或发言。因此,RegEx需要灵活。
这个问题不是重复的,因为引用的另一个问题是电影脚本,这是针对gutenberg eBooks项目的。
发布于 2017-05-07 02:26:44
为有限的例子提供一个正则表达式是容易的,但不可避免地是不可靠和脆弱的。必须有另一种方法来提取更多相关块中的信息。原因是有有限的可预测的模式,这将允许识别一个新的议长/讲话组合。在这种情况下,Mr. ALLCAPSNAME.似乎是唯一的半可靠标识符。使用这一方法,如果任何演讲的单词Mr|Ms|Mrs后面都是大写单词,那就会被误认为是断点。所以它会被绊倒:
ABC先生。我想ABC太太。太可怕了。
会给你:
[('Mr. ABC.', 'I think'), ('Mrs. ABC.', 'is awesome.')]我可以很容易地看到有人在演讲中提到先生/女士/夫人。如果找不到更好的提取方法,这可能会奏效,但我不相信:
In [1]: pattern = re.compile(r"""
(?<=\b)\s*
(?P<Speaker>M(?:rs?|s)\.\s+[A-Z]+\.)\s+
(?P<Speech>.+?\.)
(?=\s+M(?:rs?|s)\.\s+[A-Z]+\.|$)
""",
re.VERBOSE)
In [1]: pattern.findall(example)
Out[1]:
[('Mr. COX.',
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum sollicitudin vestibulum consectetur. Aliquam rhoncus nisl id velit gravida, quis volutpat est eleifend. Donec posuere a magna ac molestie. Vivamus sed lacinia lectus, quis feugiat libero. Nam sapien lacus, hendrerit at posuere ut, ullamcorper sit amet augue. Ut fringilla lobortis nulla. Nulla facilisi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam efficitur rutrum dictum. Aenean a sem mollis justo scelerisque posuere eget sit amet orci. Praesent condimentum, leo at commodo dapibus, leo mi pretium lectus, et sagittis lorem sapien ut enim. Nulla sagittis varius eros, eget pretium arcu suscipit aliquet.'),
('Mr. SEABASS.',
'Ut condimentum lobortis suscipit. Donec eget tempor ex, vel porttitor velit. Aliquam vulputate, leo in aliquet laoreet, sem ante dapibus velit, nec imperdiet felis tellus vel leo. Nunc mattis velit sed turpis consectetur tempus. Nam volutpat vel metus sed aliquam. Curabitur vitae elit urna. Nulla vehicula sapien quis libero elementum, vitae sodales tellus commodo. Pellentesque pulvinar felis vitae neque viverra posuere vitae sit amet neque. Curabitur lorem libero, mollis consectetur tempus sit amet, tincidunt vitae dolor. Cras ullamcorper arcu ac orci pharetra consequat. Nunc magna justo, sollicitudin at enim vel, volutpat elementum sapien. Mauris sit amet velit in diam imperdiet tempor facilisis et ex. Praesent consectetur leo a eros mattis tempor.'),
('Mr. REX.',
'Nullam interdum urna quis nunc sodales, id posuere nisl malesuada. Nam nec lacus et ipsum ultrices pharetra. Nullam vitae mauris sodales, fringilla augue at, efficitur arcu. Sed ex diam, ullamcorper a auctor eget, volutpat sit amet est. Suspendisse urna eros, ullamcorper in semper at, lobortis eget quam. Fusce auctor, augue sit amet convallis condimentum, diam libero porta lectus, consectetur posuere nisi mi non nulla. Suspendisse vel ante efficitur, eleifend justo sed, lobortis augue. Sed rhoncus neque libero, et tempor ipsum imperdiet id. Integer at purus eget dolor pharetra varius ut et massa. Etiam risus enim, ultrices vitae nisl eu, interdum dignissim tellus. Nullam tellus metus, finibus non justo at, lobortis imperdiet tortor. Nulla nec tortor sagittis, fringilla nisi quis, bibendum leo.')]如果此模式有效,您可以使用它来XMLize它:
def to_xml(l):
base_element = Element('Gutenburg')
speeches = SubElement(base_element, 'Speeches')
for speaker, speech in l:
sp = SubElement(speeches, 'Speech')
s = SubElement(sp, 'Speaker')
s.text = speaker
text = SubElement(sp, 'Text')
text.text = speech
return base_element然后:
tostring(result)用于xml字符串。
https://stackoverflow.com/questions/43827036
复制相似问题