2011-02-23 89 views

回答

4

我假設你有一個像[[Worf]] son of [[Mogh]]一個字符串,從要 「迴歸」(即匹配)[[Worf]][[Mogh]]。要做到這一點,您需要捕獲圍繞想要捕獲的正則表達式部分(又名「返回」)的組(括號)。爲了不返回son of,您還需要刪除您在其中的捕獲組(嵌套在(?:...)之內)。

在代碼:

>>> s = '[[Worf]] son of [[Mogh]]' 
>>> p = re.compile('(\[\[[A-Za-z\s]+\]\])(?:.*son of.*)(\[\[[\|,A-Za-z\s]+\]\])') 
>>> print p.match(s).groups() 
('[[Worf]]', '[[Mogh]]') 

如果您使用的.groups()方法來獲得匹配的部分,你也可以刪除非捕獲組圍繞.*son of.*,這可能會使RE更具可讀性(我碰巧認爲它的意圖 - 不捕捉 - 更清楚)。

0

嘗試以下操作:(\[\[[A-Za-z\s]+\]\])(?:.*son of.*)(\[\[[\|,A-Za-z\s]+\]\])

p = re.compile(r"(\[\[[A-Za-z\s]+\]\])(?:.*son of.*)(\[\[[\|,A-Za-z\s]+\]\])") 
m = p.match("[[A]] son of [[B]]") 
print m.groups() 
# ('[[A]]', '[[B]]') 
0
>> a = "\[\[([A-Za-z]+)\]\] son of \[\[([A-Za-z]+)\]\]" 
>> p = re.compile(a) 
>> m = p.match("[[A]] son of [[B]]") 
>> m.groups() 
('A', 'B') 
1

我會迴應dcrosta的答案,雖然我個人更喜歡使用命名捕獲。雖然使用名爲捕捉使得正則表達式本身有點難以閱讀,它可以讓你捕捉類似於字典的訪問:

>>> mw_string = "[[Duras]] son of [[Ja'rod]]" 
>>> son_re = re.compile('\[\[(?P<son>[^\]]+)\]\](?:.*son of.*)\[\[(?P<parent>[^\]]+)\]\]') 
>>> print son_re.match(mw_string).group("son") 
Duras 
>>> print son_re.match(mw_string).group("parent") 
Ja'rod 

使用名稱的優點捕捉的是,你可能會創建一整套各種使用regexen的,每一個都有一個你想以特定有意義的順序退出比賽的定義的參數集(例如,「[[Ja'rod]]的兒子[[Duras]]」)。

由於它看起來像是在解析MediaWiki,因此使用mwlib來遍歷鏈接,然後找到那些在其周圍環境中具有「子」的東西可能會很有用。這肯定會有助於各種特殊形式的鏈接不符合這套正則表達式。