1

我希望让用户问一个简单的问题,这样我就可以从输入的字符串中提取一些标准元素。

要输入的字符串示例:

  • 黑暗骑士的导演是谁?
  • 中国的首都是哪里?
  • 美国总统是谁?

正如你所看到的,有时是“谁”,有时是“什么”。我最有可能在寻找“|” 操作员。我需要从这些字符串中提取两件事。“the”之后和“of”之前的单词,以及“of”之后的单词。

例如:

第 1 句:我希望将其提取"director"并放入名为 的变量中Relation,并将其提取"The Dark Knight"并放入名为 的变量中Concept

期望的输出:

RelationVar = "director"
ConceptVar = "The Dark Knight"

第二句:我希望提取“资本”,将其分配给变量“关系”......并提取“中国”并将其放入变量“概念”中。

RelationVar = "capital"
ConceptVar = "China"

关于如何使用该re.match功能的任何想法?或任何其他方法?

4

2 回答 2

1

这是脚本,您可以简单地使用 | 可选匹配括号内的一个。

这对我来说很好

import re
list = ['Who is the director of The Dark Knight?','What is the capital of China?','Who is the president of USA?']
for string in list:
    a = re.compile(r'(What|Who) is the (.+) of (.+)')
    nodes = a.findall(string);
    Relation = nodes[0][0]
    Concept = nodes[0][1]
    print Relation
    print Concept
    print '----'

此致:)

于 2013-05-21T08:09:01.107 回答
1

您想|用于谁/什么是正确的。正则表达式的其余部分非常简单,组名是为了清楚起见,但您可以r"(?:Who|What) is the (.+) of (.+)[?]"改用。

>>> r = r"(?:Who|What) is the (?P<RelationVar>.+) of (?P<ConceptVar>.+)[?]"
>>> l = ['Who is the director of The Dark Knight?', 'What is the capital of China?', 'Who is the president of USA?']
>>> [re.match(r, i).groupdict() for i in l]
[{'RelationVar': 'director', 'ConceptVar': 'The Dark Knight'}, {'RelationVar': 'capital', 'ConceptVar': 'China'}, {'RelationVar': 'president', 'ConceptVar': 'USA'}]

如果您还想捕捉问题是否使用了谁或什么,请更改(?:Who|What)为。(Who|What)

实际上提取数据并将其分配给变量非常简单:

>>> m = re.match(r, "What is the capital of China?")
>>> d = m.groupdict()
>>> relation_var = d["RelationVar"]
>>> concept_var = d["ConceptVar"]
>>> relation_var
'capital'
>>> concept_var
'China'
于 2013-05-21T00:28:26.967 回答