2013-05-21 75 views
1

我希望讓用戶提出一個簡單的問題,這樣我就可以從輸入的字符串中提取幾個標準元素。要輸入字符串的簡單問題的Python正則表達式

例子:

  • 誰是黑暗騎士的導演?
  • 中國的首都是什麼?
  • 誰是美國總統?

正如你可以看到有時它是「誰」,有時它是「什麼」。我很可能在尋找「|」運營商。我需要從這些字符串中提取兩個東西。 「之後」一詞之後,「之後」一詞以及「之後」一詞。

例如:

第一句:我希望提取"director",並將其放置在一個名爲Relation變量,並提取"The Dark Knight",並將其放置在一個名爲Concept變量。

所需的輸出:

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

第二句:我希望提取「資本」,將其分配給變量「關係」 ......並提取「中國」並將其放置在變量「概念」。

RelationVar = "capital" 
ConceptVar = "China" 

關於如何使用re.match函數的任何想法?或任何其他方法?

+0

自然語言解析並不簡單。你可以用正則表達式將句子拆分成單詞,但這就是你可以用它做的所有事情。 – Blender

+0

是否所有問題的形式都是? – Barmar

+0

@Barmar是所有問題都以這種形式保持簡單:) –

回答

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' 
+0

這確實是im之後。問題:現在你已經將問題硬編碼爲例子(顯然)......所以現在我將試圖使用用戶輸入來分配變量「l」。對? Thanx :) –

+0

@ RHK-S8如果你想獲得用戶輸入,請查看'raw_input'函數(或者,如果你使用的是python 3,則只是'輸入')。很高興幫助:) –

+0

順便說一句,這是否意味着在你的例子中它現在被分配了鍵/值對?由於我沒有看到他們如何分配:(對於問愚蠢的問題抱歉。 –

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 '----' 

最好的問候:)