【发布时间】:2018-08-10 00:28:11
【问题描述】:
下面的代码块显示了我正在尝试做的事情。我希望它是不言自明的。
sentence = "the heros aka justice league. \
john also known as jacob when he's not being john"
identities = ['the heros', 'heros', 'justice', \
'justice league', 'john', 'jacob']
bridges = ['aka', 'also known as']
# desired matches:
# the heros aka justice league
# heros aka justice league
# the heros aka justice
# heros aka justice
# john also known as jacob
我的一般策略是定义三个捕获组..
ie - using ('|'.join(identities))
('|'.join(bridges))
('|'.join(identities))
.. 形成组内的模式。这是没有任何环顾或其他复杂情况的模式,只是为了建立一个基线:
(
(\bthe heros\b|\bheros\b|\bjustice\b|\bjustice league\b|\bjohn\b|\bjacob\b)
([\s\.]*)
(\baka\b|\balso known as\b)
([\s\.]*)
(\bthe heros\b|\bheros\b|\bjustice\b|\bjustice league\b|\bjohn\b|\bjacob\b)
)
但那些其他复杂情况(环顾四周等)无疑是关键,也是我需要帮助的地方。
为了使事情进一步复杂化,我需要每个捕获元素的字符位置。例如,我需要知道捕获的“john”在哪里,而不是句子末尾的另一个未捕获的“john”。因此,我使用 re.finditer 在 python 中返回匹配对象,因为这些匹配对象包含偏移量。
编辑---------------
对于那些希望看到我继续努力的人......这种模式:
(?=(the heros|heros|justice|justice league|john|jacob)
\s*(aka|also known as)
\s*(?=(the heros|heros|justice|justice league|john|jacob)).)
产生以下匹配:
[('the heros', 'aka', 'justice'), ('heros', 'aka', 'justice'), ('john', 'also known as', 'jacob')]
这很接近。但是“联赛”永远不会匹配。
进一步编辑-------------
啊..但是在模式末尾的前瞻并没有真正的意义。您必须使用后视 (?[look-behind requires fixed-width pattern],这在这种情况下也具有挑战性。那么,现在,我已经诉诸于循环遍历最后一个捕获组中的元素并一个一个地使用它们。
for element in identities:
'(?=(the heros|heros|justice|justice league|john|jacob)
\s*(aka|also known as)
\s*('+element+')))'
【问题讨论】:
-
你可以把
\b放在替代品之外:\b(the heros|heros|justice|...)\b -
您已经描述了您想要做什么,但还没有提出任何问题。你有什么问题?使用
re.finditer的代码在哪里? -
我认为我的代码只会分散注意力。无论如何,我无法展示我尝试过的每一个变化。问题是如何一次捕获问题中列出的所有结果。显然,这涉及重叠匹配。我希望这会有所帮助。
-
重点是,我知道有些人会坐下来尝试写一些代码。我不想让他们解决我碰巧遇到的任何麻烦,而是想尽我所能提供最好的起点。
-
这不是本网站的工作方式。我们不为您编写代码,我们帮助您修复代码。发布您认为最接近解决方案的内容,我们会告诉您您做错了什么以及如何解决。